在任何NullPointerException消息中包含類名和變量名是否有用?我知道它可能並不總是可能的,因爲JIT所做的更改似乎是經常可用的信息(班級成員等)。在任何NullPointerException消息中包含類名和變量名是否有用?
來源:http://jamesjava.blogspot.com/2005/04/what-was-null.html
在任何NullPointerException消息中包含類名和變量名是否有用?我知道它可能並不總是可能的,因爲JIT所做的更改似乎是經常可用的信息(班級成員等)。在任何NullPointerException消息中包含類名和變量名是否有用?
來源:http://jamesjava.blogspot.com/2005/04/what-was-null.html
過程中的錯誤提供了儘可能多的信息可能是一件好事,對吧?
幫助追蹤錯誤。
編輯:(是)
你扔NullPointerException
?我想你應該在代碼中做null
驗證。 我也會考慮使用開源記錄工具,如Log4J
。
這取決於。如果你得到堆棧跟蹤,很明顯什麼類拋出異常。這通常會導致確保你的環境會在沒有出現異常時給你堆棧跟蹤。
是的,這將是有益的。特別是如果您有一種機制,屏幕上顯示錯誤消息(exception.getMessage()
),但實際的堆棧跟蹤會隱藏在您無法立即訪問的日誌文件中。
不,我不認爲這完全是「有用的」。
相反,你應該小心不要把NPE放在第一位。在使用它們之前檢查您的值(null
驗證)等。這應該發生在之前您調用庫方法和之後您得到的結果(如果API指定該方法可能會返回null
。當然,有時它會這樣做,但這是一個錯誤)。
如果您認爲NPE應該攜帶此信息進行調試,請再考慮一下。這是調試器的優點。一個例外就是告訴你出了什麼問題。請記住,未經檢查的異常在運行時發生 - 必須在那裏生成。爲了知道哪個變量包含null
,字節代碼必須知道變量名稱。你不想用這樣的東西來膨脹你的字節碼。類名包含在我從我的程序中收到的每個日誌輸出中。這就是日誌記錄的好處。
Java通過爲您提供行號和完整堆棧跟蹤,已經大大簡化了調試過程。 C程序因Segmentation fault
而失敗。您必須使用strace
或調試器才能獲得如此多的信息。
注意javac
確實包括編譯時間選項,在編譯時包含的源文件的信息,但是這是爲了通過一個調試器一起使用,不是拋出隨機例外。引用孫的javac
手冊頁:
-g Generate all debugging information, including local variables. By default, only line number and source file information is generated. -g:none Do not generate any debugging information. -g:{keyword list} Generate only some kinds of debugging information, specified by a comma separated list of keywords. Valid keywords are: source
Source file debugging information lines Line number debugging information vars Local variable debugging information
長話短說:使用調試器。
在生產中具有難以複製的問題,實在不是一個好選項。 – 2008-10-14 17:06:51
堆棧跟蹤通常只給你的行號,所以如果一個以上的對象是在該行引用你仍然不知道導致異常 – Thomas 2008-09-19 04:33:46