繁体   English   中英

反序列化时java.lang.NullPointerException

[英]java.lang.NullPointerException when deserializing

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]空?

在你的

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

语句,您将忽略引发的任何异常。 因此,有可能

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

根本不初始化reservation[0] ,这将在访问时导致NullPointerException

reservation[0].getDetails();

这是您的问题:

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

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

您可能还希望考虑为您的类定义一个serialVersionUID

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

private static final long serialVersionUID = <some_long_number>;

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

如果不这样做,那么JVM会根据类本身自动为您生成serialVersionUID ,因此,如果您更改了有关该类的某些内容,您可能会突然发现在反序列化该类的较早版本时遇到问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM