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

Posted

技术标签:

【中文标题】如何通过扫描仪将 LocalDate 类型作为参数传递?【英文标题】:How to pass LocalDate type as parameter via scanner? 【发布时间】:2021-05-25 16:44:05 【问题描述】:

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

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

但我遇到了一个错误。下面是我的生日课和主课的相关部分。

Birthday.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;
    

Main.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() 方法 void 导致另一个错误说方法不能用。

注释掉的 return 语句是我认为可能的:打印出 System.out.println(ld.format(dtf)); 并将其存储在名为 addedDate 的字符串中?但对我而言,这似乎是一个非常错误的思考过程,所以最后我想知道我在 addDate() 方法中分别要求年/月/日的方法是否是什么问题?

【问题讨论】:

“使addDate() 方法无效会导致另一个错误”您不应该通过猜测进行调试。想想在代码上下文中创建该方法void 意味着什么。您应该自己看看这不是修复代码的方法。 Birthday 构造函数的第二个参数需要LocalDate。你传递了addDate(),它返回一个String。如果您想要 LocalDate,请不要返回字符串。 您的Birthday constructor 将LocalDate 作为其第二个参数。因此addDate() 的返回类型必须为LocalDate @all 我想为自己的错误大喊大叫,天哪……我不敢相信这基本上就是这样。谢谢各位! 这能回答你的问题吗? Java string to date conversion 【参考方案1】:

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

方法addDate()返回的值的类型是String

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);

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

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());
    

【讨论】:

阿布拉,非常感谢!我现在看到了我的错误,在我的脑海中,在 LocalDate 和 String 之间跳转是有道理的,这不是很聪明。所以谢谢你的更正!并用于解析/格式化! :) 关于扫描仪声明:也会记住这一点!我读到我应该在实际使用它们的地方打开+关闭扫描仪,也许我误解了这一点。但是,是的,再次感谢您的帮助!【参考方案2】:

    不要在addDate() 中创建新的Scanner 对象

    使用已经创建的Scanner 对象,并简单地将字符串读取为LocalDate,例如LocalDate.parse(scan.next())

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

传递日期字符串如

2021-02-23

【讨论】:

以上是关于如何通过扫描仪将 LocalDate 类型作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WCF 中将 Noda Time(或任何第三方类型)对象作为参数传递?

使用 LocalDate 类型参数发送请求

Spring Data - 如何将 YearMonth 类型的 @Param 转换为 LocalDate 的开始和结束?

localdate如何返回成字符串前端

springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate

急求,用JAVA编写,键盘输入生日,用LocalDate写