2011-07-26 37 views
4

我依賴的代碼有一些不兼容的變化。 所以我想如果我使用這個釣NoSuchMethodException記錄有關問題如何捕獲NoSuchMethodException?

信息。

try{ 
    do.something();  
}catch(NoSuchMethodException e){ 
    System.out.println("!"); 
} 

我得到這個錯誤「的NoSuchMethodException無法到達的catch塊,此異常從不拋出嘗試聲明正文「

我試着也趕上java.lang.RuntimeException並檢查它是否是NoSuchMethod但它沒有工作。

反射會造成性能延遲,不想使用它...

任何想法?

+0

你的do.something()實際上做了什麼? –

+2

捕捉RuntimeException不起作用,因爲NoSuchMethodException不是RuntimeException的子類 –

回答

6

您對NoSuchMethodException引發混淆,只有在調用不存在的方法時纔會使用反射和NoSuchMethodError,當您直接調用方法時可能會引發此方法,而此方法在編譯時存在並且在運行時不存在。它通常發生在編譯和運行時使用不同版本的外部庫。

底線:抓的NoSuchMethodError

+3

是的,我是個白癡.... – npocmaka

5

代替NoSuchMethodError。但是,這看起來像一個醜陋的解決方法,我建議只是解決不兼容問題。

+0

正是如此。在不再有方法定義的類中調用方法會生成錯誤,而不是異常。 –

+0

拋出的錯誤/異常的類型取決於代碼試圖執行的操作。代碼嘗試調用無效方法時發生NoSuchMethodError。而代碼在嘗試爲不存在的方法調用getMethod()時引發NoSuchMethodException。 –

1

NoSuchMethod應該意味着你試圖訪問一個不存在,可能在運行時的方法。如果你解決這個問題,而不是試圖捕獲異常,那麼最好。

其更好地的地方,它的意思是讓你不必像輸出錯誤的邏輯錯誤等

1

我會建議你去@馬特B的回答方法。使用NoSuchMethodError.

但是,如果你想趕上NoSuchMethodException,你必須明確地把它用,用於NoSuchMethodException

throw new NoSuchMethodException(); 
1

無法到達的catch塊。這個例外是 從來沒有從try語句框體拋出

正如IDE /編譯器所說的。在try體中,不會拋出NoSuchMethodException異常。這意味着,你們沒有被調用方法聲明爲:

public void doSomething() throws NoSuchMethodException 

,也從未有字面上扔在try身體NoSuchMethodException

throw new NoSuchMethodException(); 
1

編輯:這作爲一般解決如何聲明檢查的異常。正如其他人已經指出,你應該趕上NoSuchMethodError甚至IncompatibleClassChangeError因爲這是什麼會在運行時被拋出。


由於要針對不同的版本庫的鏈接,不是針對編譯(本身並不可取,但我不是一個判斷),你需要convice編譯器,這一切一切順利。這樣做,在這種情況下

的一種方式,是創建一個靜態輔助聲明例外:

class Util { 
    public static void unsafeApiCall() throws NoSuchMethodException { 
     // if (false) prevents a compilation error 
     if (false) throw new NoSuchMethodException(); 
    }; 
} 

使用像

try { 
    Util.unsafeApiCall(); 
    do.something();  
} catch(NoSuchMethodException e2) { 
    System.out.println("!"); 
} 

這也代表了視覺上,這是一個很好的事情。


EDIT2:這樣的事情可能是nessecary,如果你把自己的checked異常沒有聲明,描述here

1

首先,我強烈反對所有的人告訴你要捕捉錯誤。不要這樣做。錯誤應該單獨留到泡到任何應用程序範圍的異常處理程序。如果你的應用程序這樣做,那麼你所要做的只是爲了獲得你的日誌文件的不兼容性證據。

另外,不要在代碼中使用反射來判斷代碼,直到您對代碼進行概要分析並計算出需要多長時間爲止。通常會猜測減速最終會導致錯誤。在進行測量並證明它是瓶頸之前,您不應該優化任何東西。

挖掘do.something代碼,如果沒有源代碼,請將其反編譯並查看實際拋出的代碼。可能的話,如果異常被拋出,它可能會被另一個異常包裝。確保該方法引發的任何內容不被吃掉(包括通過你自己的日誌記錄)。