gpt4 book ai didi

java - 为什么用 simpledateformat 解析会抛出空指针异常?

转载 作者:行者123 更新时间:2023-12-02 09:28:21 25 4
gpt4 key购买 nike

我试图在将日期分配给构造函数中的实例变量之前验证日期的格式。每次,它都会引发空指针异常,即使我每次尝试实例化对象时都为该字段提供一个值。我认为问题一定出在解析语句上,但我无法理解为什么那里会有空值。

此外,我想知道首先在构造函数中验证日期是否是正确的做法。我应该有一个方法来代替吗?

非常感谢您的帮助。这是我第一次接触java。

import java.text.*;

public class Photograph {
private String caption;
private final String filename;
private String dateTaken;
private int rating; //declares fields

public Photograph(String caption, String filename) {
this.caption = caption;
this.filename = filename;
this.dateTaken = "1901-01-01";
this.rating = 0; //constructor
}

public Photograph(String caption, String filename, String dateTaken,
int rating) {
this.caption = caption;
this.filename = filename;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);

try {
sdf.parse(this.dateTaken);
this.dateTaken = dateTaken;
} catch (ParseException e) {
this.dateTaken = "1901-01-01";
}
}

}

public static void main(String[] args) {
// Testing


//valid date
Photograph test_photo1 = new Photograph("cap1", "pic1", "2017-09-30", 3);
System.out.println(test_photo1.toString());
Photograph test_photo2 = new Photograph("cap2", "pic2", "2017-12-25", 0);
System.out.println(test_photo2.toString());
Photograph test_photo3 = new Photograph("cap3", "pic3", "2018-14-25", 5);
System.out.println(test_photo3.toString());
Photograph test_photo4 = new Photograph("cap4", "pic4", "2018-03-27", 4);
System.out.println(test_photo4.toString());
Photograph test_photo5 = new Photograph("cap5", "pic5", "2018-03-29", 2);
System.out.println(test_photo5.toString());
Photograph test_photo6 = new Photograph("cap6", "pic6", "2018-10-21", 9);
System.out.println(test_photo6.toString());
}

最佳答案

对于您的错误,它“非常”简单:

public Photograph(String caption, String filename, String dateTaken,  
int rating) {
..
try {
sdf.parse(this.dateTaken);
...
} catch (ParseException e) {
...
}
}

this.dateTaken 表达式解析为 null,因为您想要使用 dateTaken(参数,而不是字段)。

顺便说一句,我不会使用 String 来表示日期,而是使用 LocalDate:parse方法正是您想要做的事情,并且 LocalDate 替换 java.util.Date 并且是不可变的。

  • 下面的示例使用这样的 LocalDate,根据您的代码提供三个构造函数。字段是最终的,只有一个构造函数(最后一个)很重要。
  • 您可以通过在类中使用 null 逻辑或者使用 Optional 来避免存储空日期(NO_DATE_TAKEN)。使用其中一个本身就是另一个问题。
    public class Photograph {
private static final LocalDate NO_DATE_TAKEN = LocalDate.of(1901, Month.JANUARY, 01);

private final String caption;
private final final String filename;
private final LocalDate dateTaken;
private final int rating; //declares fields

public Photograph(String caption, String filename) {
this(caption, filename, NO_DATE_TAKEN, 0);
}

public Photograph(String caption, String filename, String dateTaken,
int rating) {
this(caption, filename, dateTaken == null ? NO_DATE_TAKEN:LocalDate.parse(dateTaken), rating);
}

public Photograph(String caption, String filename, LocalDate dateTaken,
int rating) {
this.caption = caption;
this.filename = filename;
this.dateTaken = dateTaken == null ? NO_DATE_TAKEN:dateTaken;
this.rating = rating;
}

}

我个人不会使用字符串来存储Date,也不会使用java.util.DateSimpleDateFormat来解析Date 现在我们有了 LocalDateLocalDate.parse做你想做的事情。

关于java - 为什么用 simpledateformat 解析会抛出空指针异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58175135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com