2010-12-23 62 views
59

我有以下情況。有沒有辦法在不添加拋出聲明的情況下拋出異常?

我有一個Java類,它從另一個基類繼承並重寫一個方法。 基本方法不會拋出異常,因此沒有throws ...聲明。

現在我自己的方法應該能夠拋出異常,但我要麼擁有的choise到

  • 燕子異常
  • 添加拋出聲明

既是一個不令人滿意的,因爲第一一個人會默默地忽略異常(確定我可以執行一些日誌記錄),第二個會由於不同的方法頭文件而產生編譯器錯誤。

public class ChildClass extends BaseClass { 

     @Override 
     public void SomeMethod() { 
      throw new Exception("Something went wrong"); 
     } 
} 

回答

76

你可以拋出未經檢查的異常,而不必聲明它們,如果你真的想。未經檢查的例外延伸至RuntimeException。可擴展Error的Throwable也是未選中的,但只能用於真正嚴重的問題(如無效的字節碼)。

作爲一個具體的案例,Java 8增加了UncheckedIOException用於包裝和重新推出IOException

+1

工程很好,我不得不重新拋出RuntimeException,因爲異常來自另一種方法,但它效果很好,謝謝。 – 2010-12-23 14:42:42

3

爲什麼不拋出未經檢查的異常?這不需要聲明。

兩個備選方案

  • 包裝與未經檢查的一個檢查異常。
  • 不要讓編譯器知道你正在拋出一個檢查異常,例如。Thread.currentThread()停止(E);
  • 在Java 6中,如果它是final並且編譯器知道哪些檢查了可能已捕獲的異常,則可以重新拋出該異常。
  • 在Java 7中,如果異常是有效的,您可以重新拋出一個異常,即不要在代碼中進行更改。

當你在代碼中拋出一個檢查異常並將其捕獲到你的調用代碼中時,後者會更有用,但是層之間不知道異常。

+0

-1用於暗示不推薦的功能 – OrangeDog 2010-12-23 14:37:54

+0

第二種方法也是相互交流。但目前,包裝例外是非常重要的。 – 2010-12-23 14:43:44

+0

http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – OrangeDog 2010-12-23 14:45:21

18

第三種選擇是退出異常檢查(就像標準API本身有時做)和包裹檢查異常的RuntimeException

throw new RuntimeException(originalException); 

您可能需要使用一個更具體RuntimeException的子類。

0

你可以在覆蓋的方法中用try-catch塊捕獲異常。 那麼你不需要聲明throws-語句。

1

下面是攔截檢查的異常,並在未經檢查的異常包裹它們的例子:

public void someMethod() { 
    try { 
     doEvil(); 
    } 
    catch (IOException e) 
    { 
     throw new RuntimeException(e); 
    } 
} 
0

您可以使用自RuntimeException或RuntimeException的本身

使用試戴衍生的任何異常塊的異常投擲代碼,並在那裏處理

7

我只是想添加一個替代答案,純粹作爲一個FYI

是的,有拋出checked異常而不添加throws聲明,通過使用sun.misc.Unsafe類的方法。這在下面的博客文章中描述:

Throw a checked exception from a method without declaring it

示例代碼:

public void someMethod() { 
    //throw a checked exception without adding a "throws" 
    getUnsafe().throwException(new IOException()); 
} 

private Unsafe getUnsafe() { 
    try { 
    Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
    field.setAccessible(true); 
    return (Unsafe) field.get(null); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 

但是,不建議這樣做。如其他一些答案中所述,最好包裝一個未經檢查的例外。

35

這裏有一個竅門:

class Utils 
{ 
    @SuppressWarnings("unchecked") 
    private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T 
    { 
     throw (T) exception; 
    } 

    public static void throwException(Throwable exception) 
    { 
     Utils.<RuntimeException>throwException(exception, null); 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Utils.throwException(new Exception("This is an exception!")); 
    } 
} 
1

是的,有一個爲什麼,但它不是建議你可以使用:

的Java不安全包

getUnsafe().throwException(new IOException()); 

這個方法拋出檢查異常,但是你的代碼不會被強制捕獲或重新拋出它。就像運行時異常一樣。