java 異常的捕獲及處理


在沒有異常處理的程序中如果要回避異常,需要使用大量的判斷語句,配合所想到的錯誤狀況來捕捉程序中可能發生的錯誤。但是這樣勢必會導致程序運行效率降低。
java異常處理機制具有易於使用,可自定義異常類,處理拋出的異常的同時,又不會降低程序運行效率等優點。因而在java程序設計時,應充分的利用異常處理機會,以增進程序的穩定性及效率。
1.異常處理示例及基本格式:

package javaBasics;

public class test5 {

    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        try{
        int temp = i/j;                        //此處會產生異常
        System.out.println("計算結果:"+temp);
        }catch(Exception e){
            System.out.println("出現異常:"+e);    //打印異常信息
            e.printStackTrace();            //打印完整的異常信息
        }finally{
            System.out.println("不管是否出現異常都執行此代碼");
        }
        System.out.println("計算結束");
    }

}


程序的運行結果wei:

出現異常:java.lang.ArithmeticException: / by zero
不管是否出現異常都執行此代碼
計算結束

2.Exception和error

共同點:
Exception和error是java異常結構中最常用的兩個類,統稱為異常。它們都是throwable的子類
不同點:
Exception表示程序中遇到的異常,可以用try catch進行捕獲
error一般指jvm錯誤,程序中無法捕獲

(拓展:Throwable是Exception的父類,可不可以直接使用Throwable呢?

首先,使用Throwable捕獲異常,在代碼中是沒有任何問題的,但在開發中一般不會使用Throwable處理,因為其有Exception和error兩個子類,Error本身不需要程序處理,而程序中需要處理的是Exception 所以沒有必要使用Throeable)

3.Throw和Throws關鍵字

  Throws:在定義一個方法時,使用Throws關鍵字聲明,表示此方法不處理異常,而是交給調用方法來處理

(注意:不要在main方法中使用throws,main方法為一切方法的起點,一切的操作也是由主方法開始的,所以,如果在主方法中使用throws,則程序出現問題后肯定交由jvm處理,將會導致程序中斷。)

Throw:Throw關鍵字是人為的拋出異常,直接拋出異常的實例化對象。

package javaBasics;

public class test5 {

	public static void main(String[] args) {
		try{
			throw new Exception("自己拋出異常");		//拋出異常的實例化對象
		}catch(Exception e){
			e.printStackTrace();					//捕獲異常
		}
	}

}

  Throw和Throws結合應用范例:

以下代碼也是開發中使用較多的處理方式

package javaBasics;

public class Math {
	public int div(int i,int j) throws Exception{
		int temp = 0;
		try{
		temp = i/j;
		}catch(Exception e){	//捕獲異常
			throw e;			//把異常交給被調用處處理
		}finally{
			System.out.println("計算結束");
		}
		return temp;
	}
}


package javaBasics;

public class test5 {

	public static void main(String[] args) {
		Math math = new Math();
		try {
			System.out.println(math.div(10, 0));
		} catch (Exception e) {					//進行異常捕獲
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

  程序執行結果:

計算結束
java.lang.ArithmeticException: / by zero
at javaBasics.Math.div(Math.java:7)
at javaBasics.test5.main(test5.java:8)

4.自定義異常類:

package javaBasics;

public class MyException extends Exception{		//自定義異常類繼承Exception類
	public MyException(String msg){				//構造方法接受異常信息
		super(msg);								//調用父類中的構造方法
	}

}


package javaBasics;

public class test5 {

	public static void main(String[] args) {
		try{
			throw new MyException("自定義異常信息");//拋出異常
		}catch(Exception e){					//異常捕獲處理
			e.printStackTrace();
		}
	}

}

  

執行結果:

javaBasics.MyException: 自定義異常信息
at javaBasics.test5.main(test5.java:7)

 

5.Exception和runtimeException

如下示例:

package javaBasics;

public class test5 {

	public static void main(String[] args) {
		String str="123a";
		int temp = Integer.parseInt(str);	//將字符串轉換成int類型
		System.out.println(temp*temp);
	}

}

執行結果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "123a"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at javaBasics.test5.main(test5.java:7)

  執行報NumberFormatException  顯然,程序已經中斷,查看Integer類的parseInt方法源碼可以看出throws拋出了NumberFormatException 給方法調用處處理。

public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}

NumberFormatException 是runtimeException類的子類

可以得出:

Exception在程序中必須使用try。。。catch處理。

RuntimeException可以不用try。。。catch處理,產生異常后直接交給JVM處理。(在開發中最好使用try。。。catch進行處理)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM