java關於異常處理只使用try-finally而不使用catch
阿新 • • 發佈:2019-01-06
1. 前言:
通常我們在異常處理的時候一般就使用try-catch,
try {
// 需要處理的程式碼段
} catch(Exception e) {
// 異常處理方法
}
更加好一些的處理方式為try-catch-finally,
try {
// 需要處理的程式碼段
} catch(Exception e) {
// 異常處理方法
} finally {
// 無論有無異常最後都要執行的程式碼段
}
2.1 問題1:
2.1.1 如下程式碼可否執行?
public class Test {
public static void main (String[] args) {
System.out.println("return value of getValue():" +getValue());
}
public static int getValue() {
int i = 1;
try {
i = 4;
} finally {
i++;
return i;
}
}
}
2.1.2 解析
以上程式碼主要問題在於沒有使用catch,而直接使用的try-finally,那麼到底可行不可行呢?答案是可以,以上程式碼執行出來的結果為:return value of getValue():5
2.1.3 疑惑
自然我們想想也能想通,這裡沒有異常出現,那麼沒有catch也不影響,那麼問題來了…
2.2 問題2
如果在try程式碼塊中丟擲異常了呢?我們這裡只用了try-finally,還是沒有用到catch,那麼還會有結果嗎?
2.2.1 如下程式碼可否執行?
public class Test {
public static void main(String[] args) {
System.out.println("return value of getValue():" +getValue());
}
public static int getValue() {
int [] a = new int[1];
int i = 1;
try {
a[10] = 90;
i = 4/0;
} finally {
i++;
return i;
}
}
}
2.2.2 解析
以上程式碼在try中出現了異常,按照常理會進入catch中獲取異常,那麼程式還會正常執行嗎?會的,執行結果為return value of getValue():2
,這裡沒有catch,那麼沒有就不執行catch,直接進入finally程式碼塊中執行,程式正常執行。
3. 分析
嚴格的說法其實是:try只適合處理執行時異常,try-catch適合處理執行時異常+普通異常。也就是說,如果你只用try去處理普通異常卻不加以catch處理,編譯是通不過的,因為編譯器硬性規定,普通異常如果選擇捕獲,則必須用catch顯示宣告以便進一步處理。而執行時異常在編譯時沒有如此規定,所以catch可以省略,你加上catch編譯器也覺得無可厚非。