天天看點

異常 異常處理 自定義異常關鍵知識點及補充異常異常處理 自定義異常

關鍵知識點及補充

  • 出現異常如果不解決,程式無法繼續向下執行
  • 平時我們遇到的異常看書寫格式,很明顯,都是類,java源碼中在會出現異常的地方,都會有 throw new 異常類(); 也就是建立了異常,阻斷了我們的編譯,或着運作
  • 我們也可以模仿異常的來建立自己的異常來判斷阻斷,異常都是繼承自Exception|RuntimeException,編譯時|運作時異常
  • 增強程式健壯性隻能解決程式的運作時異常
  • throw制造異常    |throws 抛出異常        |try{ } catch(聲明異常 ){  } finally{} 捕獲異常    finally不管有沒有異常都會執行的代碼,catch可以有多個用于捕獲多個異常,大範圍的異常放在後面.不然後面的小捕獲就是不可達語句
  • catch (Exception e){

                System.out.println("接盤俠出現了..."); //可以捕獲所有的異常,放在最後面,接盤俠啊

            }

  • 對于try catch 而言,try中放置的是可能發生的異常,當真正發生異常時候,執行對應異常的catch内容,try後面的内容都阻斷了,不會發生

異常

 * 異常: exception

 *                   Throwable

 *               /                      \

 *        Error                         Exception

 *            |                       /                       \

 *     UnChecked        Checked        Runtime        

 *     Exception          Exception        Exception

 * 異常分為編譯時異常和運作時異常

 * Error: 一般是由虛拟機生成并脫出的,程式員不關注

 * Exception : 異常,一旦出現異常,如果不解決,程式無法繼續向下執行

 *     檢查時異常|編譯時異常:編譯期出現的異常,如果不處理,程式無法運作

 *     運作時異常: 出現在程式運作期間,可以通過程式的健壯性處理

 * 

 *     常見的運作時異常:

 *         1.類型轉換異常

 *         2.空指針異常

 *         3.數組索引越界異常

 *         4.數組長度負數異常

 *         5.數學異常 ArithmeticException

 *         6.轉換異常 NumberFormatException

異常處理

 *     throw : 制造異常 

 *     處理異常的方式:  *********

 *         throws : 抛出異常

 *         try..catch :捕獲異常

 *             try {

                可能會出現異常的代碼;

            } catch (FileNotFoundException e) {

                如果出現這個異常會執行的代碼;

                e.printStackTrace();  //列印異常的棧資訊,标紅色的列印異常資訊

            } catch (NullPointerException e){

                如果出現這個異常會執行的代碼;

            }.....

            finally{

                無論是否出現異常,都會執行finally中的代碼

            }

            如果一旦try中出現異常了,try中後面的代碼都不會執行了

            一個try後面可以跟一個或者多個catch

            如果多個catch,大範圍的在後面

 自定義異常

 *     不是java提供的異常類,根據自己的邏輯業務進行定義,合理的地方使用,注意要直接或者間接繼承異常Exception

public class DefinedException01 {
	public static void main(String[] args) {
		Person p = new Person();
		p.setName("yinwei");
		try {
			p.setAge(200);
		} catch (AgeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(p);
	}
}


//自定義異常類
//直接或者間接的繼承自Exception
//運作時異常必須直接或者間接繼承自RuntimeException
//當出現年齡不合法問題(<0||>150),會抛出這個異常

//建立一個異常類名字叫年齡異常,繼承Exception
class AgeException extends Exception{
	public AgeException() {            //這是異常類的一個空構造
		super();
	}
	
	public AgeException(String s) {   //這是利用父類的異常處理機制傳回一個字元串提示錯誤資訊
		super(s);
	}
	
}


class Person {                         //定義一個類
	private String name;                //類的參數
	private int age;                    //類的參數
	
	public Person() {                    //空構造方法
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age) {  //類的全參構造
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) throws AgeException{        //設計異常
		if(age<0 || age>150){
			//也可以是throw new  AgeException();  這樣就不會有異常提示資訊
			throw new  AgeException("有異常了,這裡是異常的提示資訊");
		}
		this.age = age;
	}
                                                            //重寫toString方法
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
           

運作結果:   //可以看出來,沒有指派成功,并且向下運作了 ,因為捕獲處理了異常

com.shsxt.exception01.AgeException: 有異常了,這裡是異常的提示資訊

    at com.shsxt.exception01.Person.setAge(DefinedException01.java:70)

    at com.shsxt.exception01.DefinedException01.main(DefinedException01.java:16)

Person [name=yinwei, age=0]