1. 程式人生 > >try-catch-finally異常處理(一)

try-catch-finally異常處理(一)

java異常處理的方式有兩種

1.捕捉異常

2.轉移異常

這裡先說捕捉異常(對於一個系統而言,異常處理是非常關鍵的,處理得好能夠避免和減少系統bug,同時也能夠非常好的定位問題來源)

捕捉異常都是通過try-catch-finally結構處理,一般有兩種格式

如下所示:

		//結構2
		try {
			//可能會產生異常的語句
		} catch (Exception e) {
			//捕捉到異常後的處理語句
		}
		
		//結構2
		try {
			//可能會產生異常的語句
		} catch (Exception e) {
			//捕捉到異常後的處理語句
		}
		finally {
			
		}

注意:catch和finally不一定同時存在。但是try必須與兩者之一共同存在,也就是說結構可以是try-catch和try-finally

寫一個簡單的異常捕捉例子

public class ExceptionTest {

	public static void main(String[] args) {
		try {
			//被除數不能為0,程式丟擲異常
			int i = 0, j = 1;
			int k = j / i;
		} catch (Exception e) {
			System.out.println("已捕捉到異常");
			e.printStackTrace();
		}
	}
}

如上i分母不能為0,所以try程式中的語句就會丟擲異常,然後catch捕捉到異常並執行catch中的語句

執行結果如下:

已捕捉到異常
java.lang.ArithmeticException: / by zero
	at ExceptionTest.main(ExceptionTest.java:7)

那到底什麼時候catch會執行什麼時候不會執行呢?以及finally什麼時候會執行?

其實catch中的語句如果在捕捉到異常的情況下都會執行,當try語句塊中丟擲異常,該異常實力物件就會依次匹配在各個catch語句塊中的型別Exception1、Exception2、Exception3.....。一旦匹配上就會進入相應的catch語句塊並執行。此時則為異常被catch語句塊捕捉到

finally語句塊一般總是會被執行,無論是否產生了異常程式都會執行。如果執行到try或者是catch語句塊中的return語句,則先執行finally語句塊

如下:

public class ExceptionTest {

	public static void main(String[] args) {
		try {
			// 丟擲(throw)異常
			System.out.println("執行try語句塊,丟擲異常");
			throw new Error();
		} catch (Exception e) {
			System.out.println("執行catch語句塊,已捕捉到Exception異常");
			e.printStackTrace();
		} catch (Error e) {
			System.out.println("執行catch語句塊,已捕捉到Error錯誤");
			e.printStackTrace();
		} finally {
			System.out.println("執行finally語句塊");
		}
	}
}
執行結果:
執行try語句塊,丟擲異常
java.lang.Error
	at ExceptionTest.main(ExceptionTest.java:8)
執行catch語句塊,已捕捉到Error錯誤
執行finally語句塊

當然當try中不做任何操作,finally也會執行。