public void test () {
//1
throw new RuntimeException();
//2
}
基本知識
如果有錯誤,不進行try-catch則會編譯報錯。
public void test () {
try {
// 1
throw new NullPointerException();
//2
} catch (RuntimeException r) {
//3
} catch (Exception e) {
//4
} finally {
//5
}
//6
}
基本知識
try-catch中,可以有多個catch,但是catch的錯誤的類型,從上到下應該是越靠近try的catch的錯誤類型要越精確,範圍越小,不然會編譯報錯,而且錯誤只會被, 舉個例子:雖然RuntimeException也是Exception,如果你throw出來的是NullPointerException,NullPointerException雖然是Exception,也是RuntimeException,但是如上圖代碼所示,會優先匹配最靠近這個Exception 的catch,且只會被一個catch匹配,,所以會執行3號區域代碼,然後執行5號區域代碼,最後執行6號區域代碼。
public void test () {
try {
// 1
throw new NullPointerException();
//2
} catch (RuntimeException r) {
//3
} catch (Exception e) {
//4
} finally {
//5
}
//6
}
執行順序如下:
- 執行1號區域代碼
- 由於throw了RuntimeException 則會直接執行對應的3號區域的代碼
- 執行5號區域的代碼
- 執行6好區域的代碼
public int testFinally () {
int a = 0 ;
try {
1
throwException();
2 return a;
} catch (RuntimeException r) {
3 System.out.println("RuntimeException");
4 return a;
} catch (Exception e) {
5 System.out.println("Exception");
} finally {
6 System.out.println("finally");
7 a=1;
}
return 0;
}
public void throwException () {
throw new RuntimeException();
}
執行順序如下:
- 1號區域代碼
- 3號區域代碼
- 4號區域代碼,但是此時不會直接返回,而是將a的值複製保存一份
- 6號區域代碼
- 7號區域代碼,但是此時已經不會影響a在第3步的值
- 4號區域代碼,return 結束函數 此時a=0
public int testFinally () {
int a = 0 ;
try {
1
throwException();
2 return a;
} catch (RuntimeException r) {
3 System.out.println("RuntimeException");
4 return a;
} catch (Exception e) {
5 System.out.println("Exception");
} finally {
6 System.out.println("finally");
7 a=1;
8 return a;
}
9 System.out.println("Exception");
10 return a;
}
public void throwException () {
throw new RuntimeException();
}
執行順序如下:
- 1號區域代碼
- 3號區域代碼
- 4號區域代碼,但是此時不會直接返回,而是將a的值複製保存一份
- 6號區域代碼
- 7號區域代碼,但是此時已經不會影響在第3步的要返回的值
- 8號區域代碼,此時a=1 此時 return a=1,結束函數
9,10不會執行。
這就是爲什麼一般finally不寫return。