考慮以下方案:與Java SE 6(和以前的版本),更精確的重新拋出異常
class FirstException extends Exception {}
class SecondException extends Exception {}
class RethrowException {
public void rethrowMethod() throws FirstException, SecondException {
boolean flag = true;
try {
if(flag)
throw new FirstException();
else
throw new SecondException();
}
catch(Exception ex) {
throw ex; // does not compile "Unhandled exception type Exception"
}
}
}
此錯誤只是與Java SE 6(或以前的版本)是因爲,首先,當我們建立「catch」塊(catch(Exception ex)),由ex指定的異常對象的類型爲FirstException
(或SecondException)。但是,當ex
被重新拋出(throw ex
),Java編譯器執行如下3項任務:
- 版本 「EX」 系統。
- 初始化新的異常對象,「EX」,其具有異常的類型
- 擲「EX」 - 這是異常的情況下,現在,不是
FirstException
(或SecondException
)實例
因此,在Java SE 6中,我們不能使用「更精確地重新拋出異常」,因爲下面的原因。但是,在Java SE 7(或更高版本)中,我們可以這樣做,因爲當我們重新拋出ex
時,運行時系統不會釋放並初始化新對象ex
。它會檢查(找到)ex1 come from (the try block above), and so know that
ex is an instance of
FirstException or
SecondException`。
我上面的解釋是否正確?
我不能說這是你的解釋和哪部分是問題。 –
我*能*告訴你,「爲什麼我可以在Java 7或更高版本上編譯這個,但不是Java 6或更低版本」(如果的確如此)與* runtime *行爲沒有任何關係。這將與*編譯器*有關,因爲它已經變得更加智能。 –
這是真的在Java> 6編譯?它看起來像一個不好的做法..編輯:它,我看到這個例子來自Java文檔[鏈接](https://docs.oracle.com/javase/7/docs/technotes/guides/language/追趕multiple.html)。 – NickL