1. 程式人生 > >java關於異常處理只使用try-finally而不使用catch

java關於異常處理只使用try-finally而不使用catch

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編譯器也覺得無可厚非。