0

在覆盖 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;
}

提前感谢您的任何指导!

4

2 回答 2

3

return getFromCity() +" "+ 
  getToCity()+" "+
  getDepartTime().getHour()+":"+
  getDepartTime().getMin()+" "+
  getArriveDay()+" "+
  getArriveTime().getHour()+":"+
  getArriveTime().getMin()+" "+
  getCost();

NPE 的唯一可能原因是 ifgetDepartTime()getArriveTime()return null。

如果任何其他方法返回 null,那么 JLS 15.18.1.1 会将它们转换为文字 string "null"。对于getDepartTime并且getArriveTime您正在尝试调用一个方法,如果返回的引用为 null,则会抛出 NPE。

于 2013-02-12T06:11:26.373 回答
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);
}

编辑:反射(在深层对象图上)是一个缓慢的操作,你应该谨慎使用它。出于调试目的(在测试环境中)或一次性使用它是可以的。

于 2013-02-12T06:22:37.120 回答