Java 为什么使用SimpleDataFormat进行解析会引发nullpointerexception?

Java 为什么使用SimpleDataFormat进行解析会引发nullpointerexception?,java,nullpointerexception,simpledateformat,Java,Nullpointerexception,Simpledateformat,我试图在将日期分配给构造函数中的实例变量之前验证其格式。每次,它都会抛出一个空指针异常,即使我每次尝试实例化一个对象时都会为字段提供一个值。我认为问题一定出在parse语句上,但我无法理解为什么会有空值 此外,我想知道首先在构造函数中验证日期是否合适。我应该有一个方法来代替吗 非常感谢你的帮助。这是我第一次接触java import java.text.*; public class Photograph { private String caption; private fi

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

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

非常感谢你的帮助。这是我第一次接触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.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来自。