反序列化时的java.lang.NullPointerException

时间:2014-04-14 13:31:13

标签: java nullpointerexception deserialization

public class ViewBooking extends javax.swing.JFrame {

    /**
     * Creates new form ViewBooking
     */
    public ViewBooking() {
        initComponents();
    }

    public void dispBookingInfo(){
        Reservation[] reservations = new Reservation[1];

        try {
            String searchCust = SearchName.getText();
            FileInputStream inStream = new FileInputStream(searchCust +
                    "booking.dat");
            ObjectInputStream objectInputFile = new ObjectInputStream(inStream);

            reservations[0] = (Reservation) objectInputFile.readObject();
            objectInputFile.close();


        } catch (Exception e) {
        }
        JOptionPane.showMessageDialog(null, reservations[0].getDetails());
    }

这是我的预订课程

public class Reservation implements Serializable {

    private String name;
    private String sDate;
    private String eDate;
    private String noOfDays;
    private String roomNo;
    private String totalAmt;

    Reservation(String name, String sDate, String eDate, String noOfDays,
            String totalAmt, String roomNo) {
        this.name = name;
        this.totalAmt = totalAmt;
        this.roomNo = roomNo;
        //throw new UnsupportedOperationException("Not supported yet.");
        //To change body of generated methods, choose Tools | Templates.
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getsDate() {
        return sDate;
    }

    public void setsDate(String sDate) {
        this.sDate = sDate;
    }

    public String geteDate() {
        return eDate;
    }

    public void seteDate(String eDate) {
        this.eDate = eDate;
    }

    public String getNoOfDays() {
        return noOfDays;
    }

    public void setNoOfDays(String noOfDays) {
        this.noOfDays = noOfDays;
    }

    public String getRoomNo() {
        return roomNo;
    }

    public void setRoomNo(String roomNo) {
        this.roomNo = roomNo;
    }

    public String getTotalAmt() {
        return totalAmt;
    }

    public void setTotalAmt(String totalAmt) {
        this.totalAmt = totalAmt;
    }

    public String getDetails(){
        return "Name: " + name + "\n" + "From: " + sDate + " to " + eDate
            + "\n" + "Duration: " + noOfDays + "Room No: " + roomNo
            + "Total amount: RM" + totalAmt;
    }
}

我可以序列化Reservation对象,但是当我尝试反序列化它并读取数据时,我在此行收到NullPointerException错误:

JOptionPane.showMessageDialog(null, reservations[0].getDetails());

这里有什么问题?

我已将代码更改为以下内容:

public void dispBookingInfo() throws Exception{
    String searchCust = SearchName.getText();
    FileInputStream inStream = new FileInputStream(searchCust + " booking.dat");
    ObjectInputStream objectInputFile = new ObjectInputStream(inStream);
    Reservation[] reservations = new Reservation[1];

    try {


        if (reservations[0] != null) {
          reservations[0] = (Reservation) objectInputFile.readObject();  
        }

        objectInputFile.close();

    } catch (Exception e) {
        System.out.println("error!");
    }
    JOptionPane.showMessageDialog(null, reservations[0].getDetails());
}

NullPointerException错误消失但我仍然无法检索任何数据。为什么我的reservation[0]为空?

2 个答案:

答案 0 :(得分:3)

在你的

try {
    ...
} catch () {
    ...
}

语句忽略抛出的任何异常。因此有可能

reservations[0] = (Reservation) objectInputFile.readObject();

根本没有初始化reservation[0],这会在访问时导致NullPointerException

reservation[0].getDetails();

答案 1 :(得分:0)

这是你的问题:

if (reservations[0] != null) {
    reservations[0] = (Reservation) objectInputFile.readObject();  
}
此时

reservations[0] 总是null,因为您只是初始化了数组。这会停止将数据填充到此处的调用,因此当您稍后尝试使用reservations[0].getDetails()访问该元素时,该元素不可避免地仍为nullnull检查完全不需要,因此请将其删除。

您可能还希望考虑为您的班级定义serialVersionUID

为此,请将其添加为类变量:

private static final long serialVersionUID = <some_long_number>;

<some_long_number>替换为您喜欢的任何long。完成后,您必须使用新的&#39;重新创建文件。你班级的版本,否则版本号不会匹配。

如果你不这样做,JVM会根据课程本身自动为你生成serialVersionUID,所以如果你改变了关于课程的某些事情,你可能会突然发现你有问题反序列化该类的旧版本。

相关问题