2012-03-27 117 views
0

由於空指針異常導致我的程序崩潰。堆棧跟蹤的類聲明導致空指針異常

剪斷:

java.lang.NullPointerException 
at com.my.GRTRecTimeSortComparator.compare(SourceFile:15) 

那當然好。但我的問題是,第15行是類聲明:

15 public class GRTRecTimeSortComparator implements Comparator<GRTRecord> { 
16 @Override 
17 public int compare(GRTRecord rec1, GRTRecord rec2) { 
18  
19  int returnVal=rec1.getRecordCalendar().compareTo(rec2.getRecordCalendar()); 
20  return returnVal; 
21 } 
22} 

它呼喚出來的功能比較全,但我不覺得這有是問題。每條記錄都有一個唯一的日曆分配給它。

任何想法?我在這裏做錯了什麼?

編輯:在響應查詢:

沒有,沒有什麼奇怪的類本身,除了我寫的事實。

我正在使用Proguard。也許混淆是不正確的取代東西?

我正在爲記錄編寫測試。他們不應該是null,也不應該Calendars;我之前立即使用它們,並取得良好效果。

也許我只是錯誤地通過了ArrayList

編輯2:

插入類的日誌行永遠不會運行。 無論我對類添加或做什麼,空指針總是會解析爲類聲明行。

刪除了Proguard混淆,但仍然沒有骰子。

我真的很沮喪。

編輯3:

對於未來用戶:

Proguard的廢墟您的堆棧跟蹤。這是上述的原因。如果遇到問題,請移除proguard。

原因實際上是數據集中的損壞記錄。

+4

很可能,您正在閱讀的源代碼與編譯代碼中的堆棧跟蹤不同步。嘗試從乾淨的建築,然後重新運行。 – 2012-03-27 16:27:18

回答

1

我強烈懷疑調試信息剛剛失去同步。把日誌記錄到你的compare方法中。我登錄(按順序):

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()

如果這不是問題,有什麼 「奇」 關於類以任何其他方式?例如:

  • 您是否使用Hibernate或類似的可能爲您創建代理的東西?
  • 這是一個內部類嗎?
+0

沒有休眠。除了使用Proguard之外,我不認爲有什麼不正常的。這些都在NetBeans平臺應用程序中,發生在SwingWorkers之一中。 – Sheriff 2012-03-27 18:43:16

+0

@Sheriff:你有沒有把我建議的日誌記錄下來?儘管如此,如果Proguard與堆棧軌跡相混淆,我不會感到驚訝。 – 2012-03-27 18:45:49

+0

我放入了日誌。但它從來沒有運行過。我禁用了Proguard,並將堆棧跟蹤失敗轉換爲「Compare」函數,正如人們所期望的那樣。重新啓用日誌記錄以查看現在發生的事情。 – Sheriff 2012-03-27 19:00:16

1

有時像這些,它很好設置您的調試器打破了錯誤。你會確切知道你的NPE在哪裏。

+0

我想這是我學習如何真正使用調試器的時候了。 – Sheriff 2012-03-27 18:53:08

1

你可能想嘗試檢查一個空REC1和REC2的完整性

+0

無都是空的。 'ArrayList'包含127996條記錄,所有記錄都具有良好的'Calendar'對象。 – Sheriff 2012-03-27 18:43:57

0

如果要實現比較的接口,那麼你只能使用compare()方法,但您嘗試訪問compareTo()方法的可比你沒不實施。 在您的程序中:

比較值以參考形式返回,無法返回到原始類型。

0

ProGuard儘可能保留調試信息,但這在技術上並不總是可行。例如,如果方法getRecordCalendar獲取內聯,則該方法拋出的任何異常現在都從調用站點拋出。