2010-01-27 70 views
2

有一個我們使用的第三方庫的方法(我無法命名它,因爲它是一個商業解決方案),它有一個方法看起來或多或少像這樣(批次和lot params):NullPointerException,但沒有空參數傳遞給函數

numerix.setPrice(Instrument instrument,YieldCurve yc,TradeDate date,Currency c,...) 

我100%確定每個參數都是非空的。 但是我在方法裏面得到了一個N​​ullPointerException。

這怎麼可能?

另外我沒有線路號碼在堆棧跟蹤,所以我怎麼能調試它?

+1

您可以通過反編譯器運行jar並查看該方法實際正在執行的操作。有時候很明顯,有時候不是。儘管它通常是文檔的很好的替代品。 – Seth 2010-01-27 17:55:36

+1

您提到您無法命名第三方解決方案並繼續執行,並使用您的代碼片段完成該操作;) – 2010-01-27 23:01:26

回答

3

有可能您的某個參數的成員爲空,並且setPrice方法試圖使用該參數。

例如,貨幣類可能有一個format成員。 c.format可能是你的空指針。檢查每個參數的成員。

2

他們的代碼有許多方法可以在沒有任何幫助的情況下解引用空指針。

它們可能會爲您提供的值編制一個數組併爲其提供一個空指針。

如果您沒有源代碼,並且您沒有支持,唯一的辦法是使用javap命令進行反編譯,並使用調試器來指導您完成字節代碼。

0
  • numerix對象是否處理狀態?也許你必須先初始化它。
  • 它訪問外部資源,靜態資源等嗎?
  • 如果您沒有源代碼,請使用jd-gui反編譯器檢查該方法,看它是否可能出錯。
1

想到的一個明顯的可能性是,numerix爲空。

要做的事情是檢查異常上的堆棧跟蹤,看看哪個線路正在拋出它。你是否在通話中得到異常,還是來自函數內部?如果後者,你回到亞倫的答案:其中一個參數可能是一個成員爲null的對象。或者,也許在處理裏面的某個地方,該函數正在創建一個空對象,因爲它自己或無效輸入的錯誤。 (在任何情況下,檢查輸入的失敗都可能是一個錯誤,但無論如何。)

你有源代碼嗎?如果是這樣,您可以在堆棧跟蹤標識的行上回家。如果不是的話,你就是盲目工作,你能做的最好的就是仔細檢查你的所有參數。