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

異常處理(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();
        }

    }
}