当前位置: 首页 > 知识库问答 >
问题:

如何通过扫描仪将LocalDate类型作为参数传递?

周博达
2023-03-14

我想通过scanner实例化另一个类的对象,但我需要传递的参数之一是LocalDate类型。这就是为什么我在主类中创建了一个方法,以便

  • 要求用户按给定顺序输入字符串(例如dd.MMM.yyyy)
  • 然后,我的程序接受输入并将其保存为字符串,以便稍后将其显示给用户

但我被一个错误困住了。下面是我的生日班和我主要班的相关部分。

生日.java:

public class Birthday {
    String name;
    LocalDate date;
    int age;
    boolean gift;

    public Birthday(String name, LocalDate date, int age, boolean gift) {
        this.name = name;
        this.date = date;
        this.age = age;
        this.gift = gift;
    }
}

主.java:

public static void addBirthday(){
        Scanner scan = new Scanner(System.in);
        //below I want to instantiate a Birthday obj
        Birthday bday = new Birthday(scan.nextLine(), addDate(), scan.nextInt(), scan.nextBoolean());
        
        bdays.add(bday); //this is referring to an ArrayList I didn't include in this excerpt   
        scan.close();
    }

...

 public static String addDate() {
        Scanner scan = new Scanner(System.in);
        LocalDate ld = LocalDate.of(scan.nextInt(), scan.nextInt(), scan.nextInt());
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd. MMM. yyyy");
        System.out.println(ld.format(dtf));
        scan.close();
        //return addedDate??;
    }

我一直得到的实例化错误是不兼容的类型:java.lang.String不能转换为java.time.LocalDate,使addDate()方法无效会导致另一个错误,说该方法不能使用。

注释掉的返回语句是我认为可能的:打印出系统.out.println(ld.格式(dtf)); 并将其存储在名为adddate的字符串中?但对我来说,这似乎是一个非常错误的思维过程,所以最后我想知道我在addate()方法中的方法,我分别要求年/月/日是什么让它出错了?

共有2个答案

尉迟招
2023-03-14

>

  • 不要在添加日期() 中创建新的扫描仪对象

    使用已经创建的Scanner对象,简单地将String读取为LocalDate

    public static LocalDate addDate(Scanner scan) {
        return LocalDate.parse(scan.next());
    }
    

    像这样传递日期字符串

    2021-02-23

  • 李谦
    2023-03-14

    Birthday类构造函数中名为date的第二个参数的类型为LocalDate

    方法 addDate() 返回的值的类型为字符串

    String不是LocalDate

    因此,在调用Birthday构造函数时,您不能使用方法addDate()的返回值作为参数值-这正是错误消息告诉您的。

    有几种方法可以解决这个问题。我建议将方法addDate()的返回类型更改为LocalDate

    与其让用户输入三个整数,不如让他输入具有所需格式的日期字符串。然后将该字符串转换为LocalDate并返回该值。

    public static LocalDate addDate() {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter a date [dd. MMM. yyyy]: ");
        String str = scan.nextLine();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd. MMM. yyyy");
        return LocalDate.parse(str, dtf);
    }
    

    顺便说一句,您不应该关闭包装标准输入的扫描仪。与其在类 Main 中的每个方法中创建 Scanner 对象,不如声明一个静态类成员。

    java prettyprint-override">public class Main {
        private static final Scanner scan = new Scanner(System.in);
    
        public static void addBirthday() {
            System.out.print("Name: ");
            String name = scan.nextLine();
            Birthday bday = new Birthday(name, addDate(), scan.nextInt(), scan.nextBoolean());
        }
    }
    
     类似资料:
    • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

    • 我制作了一个简单的程序,根据公式中的3个数字计算增量。但是,小数点后的分数和数字(如3.33、3/4)有问题。如果我将其替换为任何字母,则会出现错误: 线程“main”java中出现异常。util。java上的InputMismatchException。base/java。util。扫描仪。throwFor(Scanner.java:939)访问java。base/java。util。扫描仪。下

    • 我创建了一个简单的扫描器,用于计算中的字符串数。txt文件。每个字符串位于下一行。它算错了,每次它给我数字297,甚至有超过20000个字符串。这个txt文件是由我编写的另一个程序创建的,它从网站获取链接,并使用FileWriter和BufferedWriter将其保存到。txt文件。可能有什么问题? 编辑:字符串示例:

    • 我在使用扫描仪方面遇到了问题。getUserInput将scanner实例作为输入,并初始化来自scanner的指定大小的数组。例如:如果用户输入3,那么该方法将创建一个大小为3的数组。 然而,它一直说scnr不能转换为int......有什么建议吗?

    • 我试图从用户那里得到2个整数。这是我的代码的相关部分: 起初,它抛出一个,所以我使用了。现在,它只需跳过扫描器并立即调用。

    • 我正在为课堂做作业。由于某种原因,程序完全跳过了用户应该键入变量的部分。我想不出任何理由为什么它会以这种方式运行,因为我的其余代码位于部分之后(它要求诸如和类型之类的东西)工作正常且有序。