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]
为空?
答案 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()
访问该元素时,该元素不可避免地仍为null
。 null
检查完全不需要,因此请将其删除。
您可能还希望考虑为您的班级定义serialVersionUID
。
为此,请将其添加为类变量:
private static final long serialVersionUID = <some_long_number>;
将<some_long_number>
替换为您喜欢的任何long
。完成后,您必须使用新的&#39;重新创建文件。你班级的版本,否则版本号不会匹配。
如果你不这样做,JVM会根据课程本身自动为你生成serialVersionUID
,所以如果你改变了关于课程的某些事情,你可能会突然发现你有问题反序列化该类的旧版本。