2014-02-07 107 views
0

如果我有一些簡單的代碼:@Contract並拋出異常

public int doSomething(final String str) 
{ 
    try 
    { 
    return Integer.parseInt(str); 
    } 
    catch (final NumberFormatException e) 
    { 
    throw new IllegalArgumentException("Bad"); 
    } 
} 

一切都很好,但如果我要帶異常創作,並將其移動到它自己的方法:

public int doSomethingElse(final String str) 
{ 
try 
    { 
    return Integer.parseInt(str); 
    } 
    catch (final NumberFormatException e) 
    { 
    doThrow(); 
    } 
} 

public void doThrow() 
{ 
    throw new IllegalArgumentException("Bad"); 
} 

那麼代碼不再在IntelliJ中編譯,因爲它不知道doThrow()將始終引發異常,因此抱怨在該路徑中沒有返回值。

在我看來,這是IntelliJ合同的設置的類型,但如果我試圖將@Contract("_ -> fail")註釋添加到doThrow()它沒有幫助。我怎樣才能完成這項工作(在doThrow()這個醜陋的電話號碼後加上return null)。

回答

2

Java編譯器不知道諸如@Contract之類的JetBrains屬性。 IntelliJ可能知道doThrow()總是拋出,但編譯器不會,所以這是不正確的代碼。

在這樣的情況下,我有我使用一個實用方法:

public final class ContractUtilities { 
    public static IllegalStateException unreachable() { 
     return new IllegalStateException("Code is supposed to be unreachable."); 
    } 
    // ... 
} 

...我添加一個理論上可達throw聲明,如下所示:

public int doSomethingElse(final String str) { 
    try { 
     return Integer.parseInt(str); 
    } 
    catch (final NumberFormatException e) { 
     doThrow(); 
     throw ContractUtilities.unreachable(); 
    } 
} 

你也根本就使doThrow()返回拋出的異常:

public int doSomethingElse(final String str) { 
    try { 
     return Integer.parseInt(str); 
    } 
    catch (final NumberFormatException e) { 
     throw doThrow(); 
    } 
} 
+0

第二種解決方案他重新對我來說是好的,我會用它。謝謝! – jgm