如何通过扫描仪将 LocalDate 类型作为参数传递?
How to pass LocalDate type as parameter via scanner?
我想通过扫描器实例化另一个 class 的对象,但我需要传递的参数之一是 LocalDate 类型。这就是为什么我在 main class 中创建了一个方法以便
- 要求用户按给定顺序输入字符串(例如 dd.MMM.yyyy)
- 然后我的程序接受该输入并将其保存为字符串,以便稍后将其显示给用户
但是我遇到了一个错误。下面是我的生日class和我的主要class.
的相关部分
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() 方法 无效 导致另一个错误,指出无法使用该方法。
注释掉的 return 语句是我认为可能的:打印出 System.out.println(ld.format(dtf));
并将其存储在一个名为 addedDate 的字符串中?但对我来说似乎是一个非常错误的思考过程,所以最后我想知道我在 addDate() 方法中单独请求 year/month/day 的方法是否是错误的?
不要在 addDate()
中创建新的 Scanner
对象
使用已经创建的 Scanner
对象并像 LocalDate.parse(scan.next())
一样简单地将字符串读取为 LocalDate
public static LocalDate addDate(Scanner scan) {
return LocalDate.parse(scan.next());
}
传递日期字符串如
2021-02-23
Birthday
class 构造函数中第二个参数的类型 - 命名为 date
- LocalDate
.
通过方法 addDate()
编辑的值 return 的类型是 String
。
一个String
是不是一个LocalDate
。
因此,在调用 Birthday
构造函数时,您不能使用方法 addDate()
的 return 值作为参数值——这正是错误消息告诉您的内容。
有几种方法可以解决这个问题。我建议将 return 类型的方法 addDate()
更改为 LocalDate
.
与其让用户输入三个整数,不如让他输入一个符合您要求格式的日期字符串。然后将该字符串转换为 LocalDate
和 return 该值。
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
。与其在 class Main
中的每个方法中创建 Scanner
个对象,不如声明一个静态 class 成员。
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());
}
}
我想通过扫描器实例化另一个 class 的对象,但我需要传递的参数之一是 LocalDate 类型。这就是为什么我在 main class 中创建了一个方法以便
- 要求用户按给定顺序输入字符串(例如 dd.MMM.yyyy)
- 然后我的程序接受该输入并将其保存为字符串,以便稍后将其显示给用户
但是我遇到了一个错误。下面是我的生日class和我的主要class.
的相关部分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() 方法 无效 导致另一个错误,指出无法使用该方法。
注释掉的 return 语句是我认为可能的:打印出 System.out.println(ld.format(dtf));
并将其存储在一个名为 addedDate 的字符串中?但对我来说似乎是一个非常错误的思考过程,所以最后我想知道我在 addDate() 方法中单独请求 year/month/day 的方法是否是错误的?
不要在
中创建新的addDate()
Scanner
对象使用已经创建的
一样简单地将字符串读取为Scanner
对象并像LocalDate.parse(scan.next())
LocalDate
public static LocalDate addDate(Scanner scan) {
return LocalDate.parse(scan.next());
}
传递日期字符串如
2021-02-23
Birthday
class 构造函数中第二个参数的类型 - 命名为 date
- LocalDate
.
通过方法 addDate()
编辑的值 return 的类型是 String
。
一个String
是不是一个LocalDate
。
因此,在调用 Birthday
构造函数时,您不能使用方法 addDate()
的 return 值作为参数值——这正是错误消息告诉您的内容。
有几种方法可以解决这个问题。我建议将 return 类型的方法 addDate()
更改为 LocalDate
.
与其让用户输入三个整数,不如让他输入一个符合您要求格式的日期字符串。然后将该字符串转换为 LocalDate
和 return 该值。
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
。与其在 class Main
中的每个方法中创建 Scanner
个对象,不如声明一个静态 class 成员。
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());
}
}