2011-07-21 28 views
2

如何測試給定方法是否會拋出異常(取決於傳入的對象)而不調用它?測試一個方法是否會引發異常而不調用它

例如:

public static boolean isAllowed(SomeObject obj) 
{ 
    try 
    { 
     myMethod(obj); 
     return true; 
    } 
    catch(Exception ex) 
    { 
     return false; 
    } 
} 

但上述方法將執行MyMethod(),我怎樣才能在Java實現這一目標?

編輯:

其實,我想這樣做是爲了驗證一個文件名。看到這個:Validate a file name on Windows

+0

可以檢查源代碼,如果你擁有它,看文件,如果你不這樣做。如果你沒有,你必須運行它。 – dlev

+0

你不能用Java或其他任何我能想到的編程語言。也許在C/C++中帶有預處理指令。 – Marcelo

回答

4

正如其他人所說,這是一般不可能知道是否異常將根據輸入而不實際計算過程中被拋出。 Java是完整的,所以這可以簡化爲halting problem。但是,你可以找到所有的異常,一個方法可以在運行時拋出

try { 
    Method myMethod = this.getClass().getMethod("myMethod"); 
    System.out.println(Arrays.toString(myMethod.getExceptionTypes()); 
} catch (NoSuchMethodException e) {} 
+0

這是否包含'RuntimeException'和子類?顯然不是,因爲他們沒有「拋出」。 – delnan

+0

@delnan它確實只會報告方法簽名中聲明的檢查異常。儘管如此,這與OP所能做的一樣好。考慮這個代碼:'void foo(){if([condition requires the solution of the halting problem])throw new Exception(); }'這樣的方法是否會拋出異常? (有關相關信息,請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/10/12/absence-of-evidence-is-not-evidence-of-absence.aspx。) – dlev

+0

I'我毫不懷疑你的意見,認爲這是不可能的 - 毫無疑問。我只是說,「列入」拋出「不等於」實際上可以拋出「。 – delnan

1

你不能在編譯時知道該方法是否會在運行時拋出一個異常。

如果您想知道方法是否可以拋出異常;只是不要將該方法放在try-catch區塊中。編輯器像ecliple將清楚地顯示一個編譯錯誤,如果該方法拋出異常。

這就是你想要的;或者我誤解了你的問題。

+0

在編譯時您無法知道某個方法是否會在運行時拋出異常。只有未被捕獲的檢查異常會引發編譯器錯誤;未經檢查的例外不會。 – Paul

3

您可以提供兄弟方法isAllowed(),它明確測試導致異常的條件。

存在錯誤風險。這兩種方法需要保持同步導致異常的條件。但是,經常可以正確編寫測試方法。

從約書亞布洛赫的「有效的Java」:

與可調用僅在 一定的不可預知條件一般應該有一個單獨 「國家試驗」方法的「狀態依賴」方法的類指出是否適合調用 狀態依賴的方法。

2

在一般情況下,你不能。例如,有問題的方法可能會使用隨機數生成器來決定是否拋出異常。或者,對於一個更現實的例子,如果有問題的方法試圖打開一個文件,那麼你不能提前知道某個其他進程是否可能在打開文件之前刪除該文件(這會導致異常)。

Java告訴你它是否可能在編譯時拋出一個異常(w/throws聲明),但是你不能確定它是否會在不執行的情況下拋出異常。

1

顯然,如果你不想調用,但需要理解的行爲,如果引用,那麼你需要閱讀方法的字節碼。

另一種選擇是提供一個模擬類加載器和加載模擬類(以及因此沒有操作方法的實現)。

在一個功能完整的宇宙中,上述將是一個合理的方法。鑑於它是Java,你如何保證和衡量副作用的問題仍有待回答。也許上述內容適用於您的特定情況,但對於一般情況,您有效地要求對Java字節碼進行靜態分析,並且這可能是一個完整的研究領域。

1

最好理解方法和有效參數,而不是在調用之前盲目測試方法(這是不可能的)。

驗證您的參數,然後將它們傳遞給方法。這裏有一個簡單的例證,其中傳遞null,將導致異常:

int getLength(String s) 
{ 
    return s.length(); 
} 

void someMethod() 
{ 
    int len = -1; 
    if (myString != null) 
    len = getLength(myString); 
} 
相關問題