異常處理(try catch)

package day20150904exception;
/**
 * (1)異常處理機制中的try catch
 */
public class ExceptionDemo1 {

    public static void main(String[] args) {
        System.out.println("程序開始");
        try {
            /*
             * 當出現空指針後,jvm創建一個空指針異常實例,
             * 將它拋出來,如果沒有try語句,則拋給調用的方法,同時結束程序
             * 
             * 如果有try語句,則跳出try,程序繼續往下走
             */
            String str = null;
            System.out.println(str.length());//NullPointerException
            System.out.println(str.charAt(0));

            //空指針異常找到對應參數類型的catch後,把實例傳給e
        } catch (NullPointerException e) {
            e.printStackTrace();

            //良好的程序在最後捕捉父類Exception,不可寫在最前
        }catch(Exception e){
            e.printStackTrace();

            /**無論try裏的代碼是否出異常,finally裏的代碼都要執行
             * 
             * finally裏通常不寫return
             * 如果寫了,try中的return值無法返回方法
             * 而是返回finally中的return值
             */
        }finally{
            System.out.println("finally裏的代碼都要執行");
        }

//      String str2 = "a";
//      System.out.println(Integer.parseInt(str2));//NumberFormatException

        System.out.println("程序結束");
    }

}
/**
 * 子類重寫父類的方法時,子類方法可不拋異常
 * 可拋出父類的部分異常
 * 可拋出父類異常的子類異常
 * 
 * 不可拋出父類沒有的異常
 * 不可拋出父類異常的父類異常
*/



package day20150904exception;
//(4)獲取異常信息-------------
public class ExceptionDemo4 {
    public static void main(String[] args) {
        //String str = null;
            //拋出NullPointerException
        //System.out.println(str.length());

        try {
            String str ="a";
            //NumberFormatException
            System.out.println(Integer.parseInt(str));
        } catch (NumberFormatException e) {
            e.printStackTrace();

            //獲取異常信息:For input string: "a"
            System.out.println(e.getMessage());
        }
        System.out.println("The End");
    }
}
package day20150904exception;
/**
 * 獲取錯誤原因
 * 異常時,爲保證異常風格統一
 * 包裝之後再拋
 * 想獲取真是原因,可調用異常的getCause
 */
public class ExceptionDemo5 {
    public static void main(String[] args) {
        try {
            dosome();
        } catch (Exception e) {
            e.printStackTrace();//爆出異常java.lang.Exception,而不是空指針異常

            //使用getCause方法獲取原因
            System.out.println(e.getCause());//運行結果:null
        }
    }

    public static void dosome() throws Exception{
        try {
            String str = null;
            System.out.println(str.length());
        } catch (NullPointerException e) {
            //catch裏拋出異常,把NullPointerException包裝成Exception拋出
            throw new Exception();
        }
    }
}
package day20150904exception;
//(2)主動拋異常----------
public class Person2 {
    private int age;

    public int getAge() {
        return age;
    }
/**
 * throw異常的2種情況:
 * 1.當前方法中出了個異常
 *   處理當前異常的責任不應該歸當前方法管
 *   這時拋出異常,誰調這個方法誰解決
 * 2.當程序遇到一個滿足語法要求
 *   但是不符合業務邏輯時
 *   這種情況可以主動throw一個異常出來
 */
    public void setAge(int age) {
        if(age<=0 || age>150){
            throw new RuntimeException("年齡貌似不對哦");
        }
        this.age = age;
    }

    public static void main(String[] args) {
        Person2 p = new Person2();
        p.setAge(1000000);
    }
}
package day20150904exception;
//(3)主動拋異常----------
public class Person3 {
    private int age;

    public int getAge() {
        return age;
    }
/**
 *通常情況下若方法中throw了一個異常實例
 *則必須處理該異常,處理方式有2種:
 *1.爲throw異常添加try catch
 *2.在當前方法上聲明該類異常的拋出
 *  以便於通知調用者處理該異常
 *  
 *  RuntimeException有點例外(非檢查異常)
 */
    //throws表示可能會發生的異常
    public void setAge(int age) throws Exception{
        if(age<=0 || age>150){
            throw new Exception("年齡貌似不對哦");
        }
        this.age = age;
    }
    //永遠不要在main方法上寫throws
    public static void main(String[] args) {
        Person3 p = new Person3();
        /*
         * 如果自定義異常繼承RuntimeException,則可解決可不解決
         * 即try catch可寫可不寫
         */
        try {
            p.setAge(1000000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package day20150904exception;

import java.io.PrintStream;
import java.io.PrintWriter;



//自定義異常--------------
/**
 * 自定義異常,表示年齡不符人的年齡
 * 
 * 如果繼承RuntimeException,則可解決可不解決
 */
//public class MyException extends RuntimeException{
public class MyException5 extends Exception{
    private static final long serialVersionUID = 1L;

    //利用父類的構造方法來建立本類構造方法
    public MyException5() {
        super();
    }

    public MyException5(String arg0, Throwable arg1) {
        super(arg0, arg1);
    }

    public MyException5(String arg0) {
        super(arg0);
    }

    public MyException5(Throwable arg0) {
        super(arg0);
    }


}

-------------------------------------------------
package day20150904exception;
//()拋自定義異常----------
public class Person5 {
    private int age;

    public int getAge() {
        return age;
    }
/**
 *  RuntimeException有點例外(非檢查異常)
 */
    public void setAge(int age) throws MyException5{
        if(age<=0 || age>150){
            throw new MyException5("年齡貌似不對哦");//繼承Exception
        }
        this.age = age;
    }
    public static void main(String[] args) {
        Person5 p = new Person5();
        /*
         * 如果自定義異常MyException繼承RuntimeException,則可解決可不解決
         * 即try catch可寫可不寫
         */
        try {
            p.setAge(1000000);
        } catch (MyException5 e) {
            e.printStackTrace();
        }

    }
}
發佈了0 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章