2011-02-26 53 views
0
public void display(Date date) { 
     boolean loop = true; 
    System.out.println("Events on " + date.toString()); 
    for (int i = 0; i < schedule.length; i++) { 
     while (loop) { 
      Date tmp = schedule[i].nextOccurrence(); 
      if (tmp.compareTo(date) == 0) { 
       System.out.println(schedule[i].nextOccurrence().toString()); 
      } 
     } 
     schedule[i].init(); 
    } 
} 

如果事件發生在給定方法的日期,上面應該打印出事件的發生。 nextOccurrence方法抓取下一次事件(如果是每週或每天)。 nextOccurence看起來像這樣的DailyEvent:JAVA在「if」語句中獲取空指針異常?

public Date nextOccurrence() { 
     if (timesCalled == recurrences) { 
      return null; 
     } 
     else { 
      Calendar cal = Calendar.getInstance(); 
      cal.setTime(startTime); 
      cal.add(Calendar.DATE, timesCalled); 
      timesCalled++; 
      return cal.getTime(); 
     } 
    } 

我打電話安排[I]的.init()重置(每日事件有時間,他們可以被稱爲數量的限制的時候叫0數,記作爲具有可變重複性的整數)。

基本上,我的問題是,我得到一個NullPointerException這條線:

if (tmp.compareTo(date) == 0) { 

我嘗試了一切,我完全失去了。 任何幫助將是偉大的!

+0

如果您最後一次發生計劃會發生什麼? 'nextOccurrence()'返回什麼? – Oded 2011-02-26 20:45:52

+0

看來nextOccurrence必須返回null,這發生在timesCalled == recurrences時,只需在if語句之前放置一個println以準確找出什麼是null。 – 2011-02-26 20:46:44

+0

if(timesCalled == recurrences){return null;} – n0pe 2011-02-26 20:46:52

回答

3

你的方法nextOccurence可能返回null,你需要檢查的是:

if (tmp != null && tmp.compareTo(date) == 0) { 

此外,您loop變量從未被設置爲false,並會導致無限循環......你中調用nextOccurrence()兩次你的循環;是期望的嗎?

您可能會考慮重新設計您的getNextOccurence(),並讓您的schedule課程在您的日期實施iterator。這將改變你的循環與

Iterator<Date> iterator = schedule[i].occurenceIterator(); 
Date tmp; 
while (iterator.hasNext()) { 
    tmp = iterator.next(); 
    if (tmp.compareTo(date) == 0) { 
     System.out.println(tmp.toString()); 
    } 
} 

這是比你使用的更乾淨。

1

我有一種感覺,你的nextOccurrence()函數返回null。如果它返回null,那麼當您嘗試在該對象上使用compareTo函數時,您會得到一個NullPointerException

1

你爲什麼不在調試器中逐步完成這個工作?

我的猜測是,

public Date nextOccurrence() { 
    if (timesCalled == recurrences) { 
     return null; // <<<< 
    } 

與 '< < < <' 的線是問題的根源。