private static voidshow() { throw new UnsupportedOperationException(「拋出異常」); }
看下面這段代碼有什麼問題?php
public class SuperClass { public void start() throws IOException{ throw new IOException("Not able to open file"); } } public class SubClass extends SuperClass{ public void start() throws Exception{ throw new Exception("Not able to start"); } }
針對拋異常是IOException仍是Exception,能隨便寫嗎,結合案例說一下?java
public static void start(){ System.out.println("Java Exception"); }
public static void main(String args[]) {
try{
start();
}catch(IOException e){
e.printStackTrace();
}
}git
- 上面的Java異常例子代碼中,編譯器將在處理IOException時報錯,由於IOException是受檢查異常,而start方法並無拋出IOException,因此編譯器將拋出「異常,java.io.IOException不會在try語句體中拋出」,可是若是你將IOException改成Exception,編譯器報錯將消失,由於Exception能夠用來捕捉全部運行時異常,這樣就不須要聲明拋出語句。我喜歡這樣帶有迷惑性的Java異常面試題,由於它不會讓人輕易的找出是IOException仍是Exception。你也能夠在JoshuaBloach和NeilGafter的Java謎題中找到一些有關Java錯誤和異常的具備迷惑性問題。
捕獲異常時,爲什麼在catch中要注意異常層級關係?須要注意哪些問題?程序員
public static void start() throws IOException, RuntimeException{ throw new RuntimeException("Not able to Start"); }
public static void main(String args[]) {
try {
start();
} catch (Exception e) {
e.printStackTrace();
} catch (RuntimeException e2) {
e2.printStackTrace();
}
}github
- 這段代碼會在捕捉異常代碼塊的RuntimeException類型變量「e2」裏拋出編譯異常錯誤。由於Exception是RuntimeException的超類,在start方法中全部的RuntimeException會被第一個捕捉異常塊捕捉,這樣就沒法到達第二個捕捉塊,這就是拋出「exception java.lang.RuntimeException has already been caught」的編譯錯誤緣由。