在覆盖toString()后,我遇到了打印对象的问题。如果不覆盖toString(),我可以打印出对象引用而不会出现任何错误。但是,当我尝试覆盖toString()方法时,我可以打印出一些输出(30个输出中的~10个),只有其他一些输出错误。
错误是:
Exception in thread "main" java.lang.NullPointerException
at Airline.toString(AirlineMain.java:277)
at java.lang.String.valueOf(String.java:2902)
at java.io.PrintStream.println(PrintStream.java:821)
at AirlineMain.main(AirlineMain.java:432)
基本上我有一个名为“Airline”的类,正在创建对象并将其存储到ArrayList<Airline>
。
Airline类构造函数:
public Airline(String fromCity, String toCity, SGTime departTime,
int arriveDay, SGTime arriveTime, int cost) {
this.fromCity = fromCity;
this.toCity = toCity;
this.departTime = departTime;
this.arriveDay = arriveDay;
this.arriveTime = arriveTime;
this.cost = cost;
}
SGTime构造函数:
public SGTime(int hour, int min) {
this.hour = hour;
this.min = min;
}
我覆盖了toString():
public String toString() {
return getFromCity() +" "+ getToCity()+" "+getDepartTime().getHour()+":"+getDepartTime().getMin()+" "+getArriveDay()+" "+getArriveTime().getHour()+":"+getArriveTime().getMin()+" "+getCost();
}
所有实例属性都定义了访问者。例如:
public String getFromCity (){
return fromCity;
}
提前感谢任何指导!
答案 0 :(得分:3)
在
return getFromCity() +" "+
getToCity()+" "+
getDepartTime().getHour()+":"+
getDepartTime().getMin()+" "+
getArriveDay()+" "+
getArriveTime().getHour()+":"+
getArriveTime().getMin()+" "+
getCost();
NPE的唯一可能原因是getDepartTime()
或getArriveTime()
返回null。
如果任何其他方法返回null,则通过JLS 15.18.1.1将它们转换为文字字符串"null"
。对于getDepartTime
和getArriveTime
,您尝试调用方法,如果返回的引用为null,则会抛出NPE。
答案 1 :(得分:1)
不要重新发明轮子。我建议你使用像apache-commons ToStringBuilder
http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/builder/ToStringBuilder.html这样的知名图书馆。如果您使用toString()
进行调试,那么您也可以查看其子类ReflectionToStringBuilder
。它会用几行代码来处理需求:
@Override
toString() {
if(!DEBUG_ON) {
return super.toString();
}
return ReflectionToStringBuilder.toString(this);
}
编辑:refelction(在深度对象图上)是一个缓慢的操作,你应该谨慎使用它。出于调试目的(在测试环境中)或一次性使用,它是可以的。