![](/img/trans.png)
[英]java.lang.NullPointerException when using getStringArray
[英]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.