能够通过覆盖toString()只在ArrayList中打印一些对象

时间:2013-02-12 06:08:27

标签: java oop object arraylist tostring

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

提前感谢任何指导!

2 个答案:

答案 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"。对于getDepartTimegetArriveTime,您尝试调用方法,如果返回的引用为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(在深度对象图上)是一个缓慢的操作,你应该谨慎使用它。出于调试目的(在测试环境中)或一次性使用,它是可以的。