Java 为什么使用SimpleDataFormat进行解析会引发nullpointerexception?
我试图在将日期分配给构造函数中的实例变量之前验证其格式。每次,它都会抛出一个空指针异常,即使我每次尝试实例化一个对象时都会为字段提供一个值。我认为问题一定出在parse语句上,但我无法理解为什么会有空值 此外,我想知道首先在构造函数中验证日期是否合适。我应该有一个方法来代替吗 非常感谢你的帮助。这是我第一次接触javaJava 为什么使用SimpleDataFormat进行解析会引发nullpointerexception?,java,nullpointerexception,simpledateformat,Java,Nullpointerexception,Simpledateformat,我试图在将日期分配给构造函数中的实例变量之前验证其格式。每次,它都会抛出一个空指针异常,即使我每次尝试实例化一个对象时都会为字段提供一个值。我认为问题一定出在parse语句上,但我无法理解为什么会有空值 此外,我想知道首先在构造函数中验证日期是否合适。我应该有一个方法来代替吗 非常感谢你的帮助。这是我第一次接触java import java.text.*; public class Photograph { private String caption; private fi
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.datetake表达式解析为null,因为您希望使用datetake参数,而不是字段
另一方面,我不会使用字符串来表示日期,而是使用LocalDate:该方法完全执行您试图执行的操作,LocalDate替换java.util.date,并且是不可变的
下面的示例使用这样的LocalDate,根据您的代码提供三个构造函数。字段为最终字段,只有一个构造函数是最后一个字段。
您可以通过在类中使用null逻辑或更可选的方式避免存储空日期(NO_date_)。使用其中之一本身就是另一个问题。
公共级照片{
private static final LocalDate NO_DATE_take=LocalDate.1901,Month.一月,01;
私有最终字符串标题;
私有最终字符串文件名;
私有最终本地日期;
私有最终整数评级;//声明字段
公共照片字符串标题,字符串文件名{
此标题,文件名,无拍摄日期,0;
}
公共照片字符串标题、字符串文件名、字符串日期、,
整数评级{
thiscaption,filename,datetake==null?NO_DATE_take:LocalDate.parsedatetake,rating;
}
公共照片字符串标题、字符串文件名、本地日期拍摄日期、,
整数评级{
this.caption=标题;
this.filename=文件名;
this.datetake=datetake==null?否日期:datetake;
这个。评级=评级;
}
}
我个人不会用字符串来存储日期,现在我们有了LocalDate,并且正在做您正试图做的事情,所以我不会使用java.util.Date和SimpleDateFormat来解析日期。这是产生的错误消息:java.base/java.text.SimpleDateFormat.parseSimpleDateFormat.java:1470处的线程主java.lang.NullPointerException中的异常java:393在photo.photo.java:25在photo.mainphoto.java:100,因为您正在解析一个null。该字段直到下一行才初始化。修正顺序。你应该让解析异常被抛出。该对象对于具有该默认日期的任何人都没有多大用处。我建议您不要使用SimpleDataFormat。那门课是出了名的麻烦和过时。只需使用LocalDate.ParseDateTake和catch DateTimeParseException进行验证。LocalDate和DateTimeParseException来自。