2014-02-11 118 views
0

我在Eclipse中使用調試器來幫助我處理Java項目。我看到一個NullPointerException,其「cause」字段/屬性(不知道正確的詞是什麼)指向另一個NullPointerException,其原因指向另一個NutPointerException,等等。我已經沿着這個堆棧下了大約100個而沒有到達底部。無底堆棧的空指針異常

我不一定要求幫助修復錯誤,但爲什麼這個看似無底的堆棧會出現?

對於他們所有人來說,它們的值是「NullPointerException(id 38)」。是否只有一個實例是指自己?

乾杯!

+6

我願意打賭它不是無底的。 – christopher

+3

很難告訴你沒有看到任何代碼。 – csmckelvey

+3

...或堆棧跟蹤。 – Pedantic

回答

0

值始終以(id 38)結尾的事實告訴你,是的,它是指它自己。括號中的數字表示對象實例。所以NullPointerException指向它自己。

我已經看過幾次了。有時一個例外只是提到自己是一個原因。我從來沒有真正調查過爲什麼會發生這種情況。

+0

那好吧。謝謝(和大家)的建議。我仍然不知道爲什麼它是自引用的,但我發現問題的根源,所以現在並不重要 – user3298600

0

您可以嘗試catch異常,然後通過

public static Throwable getRootCause(Throwable throwable) { 
    Throwable cause; 
    while ((cause = throwable.getCause()) != null) { 
     throwable = cause; 
    } 
    return throwable; 
    } 

運行一下,看看是否有一個底部。 getRootCause(evilNPE).printStackTrace()

(從Guava Throwables#getRootCause()竊取代碼)

異常應該始終有一個根本原因,應該是技術上可以創建一個無限循環,但我想你會需要的反射或其他極不規範使用異常來實現那。如果真的如此,你會永遠循環上面的方法。

你可能使用遞歸處理的方式一樣

void recursion(int steps) { 
    try { 
     if (steps > 0) 
      recursion(steps - 1); 
     else 
      throw new Exception("Hidden root"); 
    } catch (Exception e) { 
     throw new Exception("Wrap Exception because we can", e); 
    } 
} 

其中每個異常被捕獲,包裝並傳播到下面的外臺階。

另一方面,您可能會誤解某些內容,例如您遵循this的參考,其中再次參考this