Java語言中的異常處理機制
阿新 • • 發佈:2019-01-24
Java中有一個Throwable的類,它有兩個子類,一個是Error類,另一個是Exception類。對於錯誤而言,是很難解決的,比如記憶體溢位等,不能夠通過異常處理來解決;異常是程式中發生的不正常事件流,比如10除以0, 檔案不存在等,需要程式設計師關心,通過處理程式讓程式繼續執行下去。但是錯誤是無法控制的,程式肯定要中斷。 異常分為執行期異常(RuntimeException)和編譯期異常(CheckedException) 執行期異常:程式執行時丟擲的異常,編譯器不會強制處理,在執行期才會處理的異常,這是就需要程式設計師找到該異常,並修改。 編譯期異常:出去執行期異常其他都為編譯期異常,程式是正確的,但因為外界條件不滿足會引發異常,此時編譯器會強制要求處理這類異常。這就需要用到throw、throws、try、catch。
public class A {
public void a(int i) {
try{
System.out.println("1.");
b(i);
System.out.println("2.");
}catch(IOException e){
System.out.println("3.1");
e.printStackTrace();
}
catch(SQLException e){
System.out .println("3.2");
e.printStackTrace();
}
catch(Exception e){
System.out.println("3.3");
e.printStackTrace();
}
System.out.println("4.");
}
public void b(int i) throws IOException,SQLException{
if(i>20){
throw new SQLException("錯錯錯");
}
if(i>5){
throw new IOException("報錯");}
}
public static void main(String[] args) {
A a=new A();
a.checkedException(2);
}
}
在上述程式碼中我們看到了,方法b中有一個int引數i,當i大於20時,用throw丟擲SQLException,i大於5時throwIOException,當你丟擲了異常但是不做處理編譯器就會報錯,此時你可以throws給上一級,用在方法上,可以用throws一層一層的拋給上一級,但是這個異常總是要解決的,程式設計師也需要分析程式碼,在合適的地方解決這個異常,解決異常時就需要用到try和catch,try就是找到這個異常,一旦找到異常後面的程式碼塊便不會執行,跳到catch去,catch到哪個異常就執行catch花括號裡面的程式碼。
在Java語言異常處理機制中還有兩個關鍵字:finally和return,簡單來說finally程式碼塊裡的程式碼是無論如何都會執行的,且只能有一個finally。return就是返回,後面的不執行了。
比如在return中使用finally
public class MultipleReturns {
public static void f(int i){
System.out.println("Initialization that requires cleanup");
try{
System.out.println("Point 1");
if(i==1) return;
System.out.println("Point 2");
if(i==2) return;
System.out.println("Point 3");
if(i==3) return;
System.out.println("End");
return;
}
finally{
System.out.println("Performing cleanup.");
}
}
public static void main(String[] args) {
for(int i=1;i<=4;i++){
f(i);
}
}
}
無論從何處return,finally裡的內容都會執行,還需要注意以下幾點:
1. try-catch-finally裡都沒有return ,finally 之後有個return ,如果try中有異常,finally執行完後,還能執行return嗎?
2. 在存在try-catch-finally的方法中,return可能出現的位置有4個,在try中,在catch中,在finally中,在finally後(try-catch-finally外的語句塊)。
3.在這4個位置都出現return的情況下(事實上應該是不可能的,如果前面3個位置都存在return,那麼最後一個位置的return就成了unreachable code,編譯不會通過),最終會執行的return應該是finally中的return。也就是finally中的return會覆蓋掉其它位置的return。