JAVA 中的異常(2)- 異常的處理方式一:try-catch

1. try - catch(finally):捕獲,本身處理

try - catch 必須搭配使用,不能單獨使用。finlly子句:與 try - catch語句連用,無論try - catch 語句是否執行順利,finlly 語句都會被執行。html

代碼格式1:java

try {
    //可能出現異常的代碼
} catch (異常類型 變量名) {
    //異常處理代碼
} finally {
    //必定會執行的代碼,如關閉資源
}

執行順序:數據庫

  • 先執行try{}語句的內容,看是否會出現問題(異常)
  • 有:直接跳轉到catch{}語句中開始執行,完成以後再執行finally{}語句中的內容。
  • 沒有:直接執行finally語句的內容
  • 當異常問題被解決後 會繼續執行下面代碼

代碼格式2:
try - catch 能夠同時存在多個catch 語句數組

try {
}
catch (異常類型1 變量名1) {
}
catch (異常類型2 變量名2) {
}
......
catch (異常類型n 變量名n) {
}

代碼中發生異常,異常被拋給第一個catch塊,若是不匹配則繼續往下一個catch進行傳遞
注: 一個try代碼塊後面跟多個catch代碼塊的狀況就叫多重捕獲函數

代碼格式3:
在Java7之前,每一個catch語句塊只能捕獲一種異常,從Java7開始就支持一個catch捕獲多種異常,多個異常之間用|隔開。日誌

try{
    //可能會產生異常的代碼
}
catch(Exception1 | Exception2 |... | Exception_n e1){
    //統一處理的異常代碼
}
finally{
    //一般是釋放資源的代碼
}

2. try - catch用法

public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            // 除數不能爲0,此行會拋出 ArithmeticException 異常
            int i = 10 / 0;
            // 拋出異常後,此行不會執行
            System.out.println("i = " + i); 
        } catch (ArithmeticException e) { // 捕獲 ArithmeticException 異常
            // 異常最詳細信息
            e.printStackTrace();  
            // 發生異常的緣由
            System.out.println("e.getMessage() : " + e.getMessage()); 
            // 獲取異常的類型和異常描述信息
            System.out.println("e.toString() : " + e.toString());  
        }
    }
}

3. finally 用法

  • try - catch - finally搭配使用,或者 try - finally 搭配使用。
  • finally代碼塊中的代碼總會被執行
  • 通常用於資源回收釋放等操做
public class ExceptionDemo {
    public static void main(String[] args) {
    
        // try-catch-finally搭配使用
        try {
            int[] arr = {1,2,3};
            // 數組索引越界,此行會拋出 ArrayIndexOutOfBoundsException 異常
            int i = arr[3];
            // 拋出異常後,此行不會執行
            System.out.println("i = " + i);
        }catch(ArithmeticException e) {
            System.out.println(e.getMessage());
        }finally {
            System.out.println("finally");
        }
        
        // try-finally搭配使用
        try {
            int[] arr = {1,2,3};
            int i = arr[3];
            System.out.println("i = " + i);
        }finally {
            System.out.println("finally");
        }
    }
}

4. 範例

例4.1

public class trycatch {
 
	public static void main(String[] args) {
	
		try {
		    int a =10 / 0;
		    System.out.println("a:"+a);
		}catch (Exception e) {
			System.out.println("出現異常");
	    }finally {
		    System.out.println("finally");
     	}
     	
		System.out.println("end");
	}
}

輸出結果:code

出現異常錯誤htm

finallyblog

end索引

解釋: try程序段發生異常後,執行catch段,而後執行finally段,而後順尋執行try - catch - finally段後面的程序。

例4.2

public class trycatch {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {  //寫嘗試要執行的代碼
		int a =10 / 0;
		System.out.println("a:"+a);
		}catch (Exception e) {
			System.out.println("出現異常錯誤");
            return;
	    }finally {
		    System.out.println("finally");
	    }
	    // 程序return,try - finally 代碼塊後續代碼不會執行
		System.out.println("end");
    }
}

輸出結果:

出現異常錯誤

finally

解釋: try程序段發生異常後,執行catch段,而後執行finally段,而後執行catch段的return

例4.3

public static void main(String[] args) {
	
	try {
		int a =10 /10;
		System.out.println("a:"+a);
		return;
	}catch (Exception e) {
		System.out.println("出現異常錯誤");
	}finally {
		System.out.println("finally");
	}
	// 程序return,try - finally 代碼塊後續代碼不會執行
	system.out.println("end");
}
}

輸出結果:

a:1

finally

解釋: try - catch - finally 語句中有return語句時,會執行 finally 語句內容但不會執行 try - catch - finally 語句以外的代碼。

例4.4

public class ExceptionDemo {
    public static void main(String[] args) {
    
        // try-catch-finally搭配使用
        try {
            int[] arr = {1,2,3};
            // 數組索引越界,此行會拋出 ArrayIndexOutOfBoundsException 異常
            int i = arr[3];
            // 拋出異常後,此行不會執行
            System.out.println("i = " + i);
        }catch(ArithmeticException e) {
            System.out.println(e.getMessage());
            // 程序強制退出,finally 代碼塊不會執行
            System.exit(0); 
        }finally {
            System.out.println("finally");
        }
        // 程序強制退出,try - finally 代碼塊後續代碼不會執行
	    system.out.println("end");
        
    }
}

5. 注意點:

  • try-catch-finally 搭配: 這種形式捕獲異常時,開發者能夠在 catch 代碼塊中處理異常(如打印日誌、日誌記錄等),異常處理權在開發者。
  • try-finally 搭配: 這種形式捕獲異常時,默認拋出給 JVM 處理,JVM默認處理時調用 e.printStackTrace() 方法打印異常詳細信息。
  • finally 代碼塊: 除非程序強制退出,不然不管程序是否發生異常,finally 代碼塊總會執行。
    finally 中拋出異常會覆蓋(消滅)前面 try 或者 catch 中的異常,儘可能避免在 finally 代碼塊中拋出異常。
  • 若是 try 中和 finally 中都有 return 語句,程序會先執行 finally 中的 return 語句,而後程序塊運行結束,而不會執行 try 中的 return 語句。因此儘可能不在finally中使用 return 語句。
  • finally代碼塊只有一種狀況不會被執行:那就是在finally以前執行了System.exit(0)。finally代碼塊一般用來關閉資源(數據庫鏈接,IO流等)。
  • try是一個獨立的代碼塊,在try中定義的變量只能在try塊中使用,若是想在try塊外使用,則需在try外創建引用,在try中初始化。
  • catch語句能夠定義多個,但子類異常須要先catch,不然代碼不可達,編譯不經過。
  • finally塊僅僅用來釋放資源是最合適的,減輕finally的任務,不要在finally中作一些其它的事情。將盡可能將全部的return寫在函數的最後面,而不是try ... catch ... finally中。
  • 方法在重寫時,不能拋出新的異常類型,只能拋出原有異常類型及其子類。
  • 多個異常使用捕獲:多個異常分別處理

做者:快樂隨行

https://www.cnblogs.com/jddreams/p/14281918.html

相關文章
相關標籤/搜索