1. 程式人生 > 其它 >|NO.Z.00069|——————————|BigDataEnd|——|Java&集合類庫.V05|----------------------------------------------|Java.v05|異常機制.v50|異常丟擲|補充|

|NO.Z.00069|——————————|BigDataEnd|——|Java&集合類庫.V05|----------------------------------------------|Java.v05|異常機制.v50|異常丟擲|補充|



[BigDataJava:Java&集合類庫.V05]                                                                             [BigDataJava.核心類庫] [|章節一|集合類庫|異常機制.五|異常的丟擲|異常丟擲補充|]








一、異常丟擲
### --- 基本概念

——>        在某些特殊情況下有些異常不能處理或者不便於處理時,
——>        就可以將該異常轉移給該方法的呼叫者,這種方法就叫異常的丟擲。
——>        當方法執行時出現異常,則底層生成一個異常類物件丟擲,此時異常程式碼後續的程式碼就不再執行。
### --- 語法格式

——>        訪問許可權 返回值型別 方法名稱(形參列表) throws 異常型別1,異常型別2,...{ 方法體; }
——>        如:
——>            public void show() throws IOException{}
### --- 方法重寫的原則

——>        a.要求方法名相同、引數列表相同以及返回值型別相同,從jdk1.5開始支援返回子類型別;
——>        b.要求方法的訪問許可權不能變小,可以相同或者變大;
——>        c.要求方法不能丟擲更大的異常;
### --- 注意:

——>        子類重寫的方法不能丟擲更大的異常、不能丟擲平級不一樣的異常,
——>        但可以丟擲一樣的異常、更小的異常以及不丟擲異常。
### --- 經驗分享

——>        若父類中被重寫的方法沒有丟擲異常時,則子類中重寫的方法只能進行異常的捕獲處理。
——>        若一個方法內部又以遞進方式分別呼叫了好幾個其它方法,
——>        則建議這些方法內可以使用丟擲的方法處理到最後一層進行捕獲方式處理。
二、程式設計程式碼
package com.yanqi.task16;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ExceptionThrowsTest {

    public static void show() throws IOException {
        FileInputStream fis = new FileInputStream("d:/a.txt");
        System.out.println("我想看看你丟擲異常後是否繼續向下執行???");
        fis.close();
    }

    public static void test1() throws IOException {
        show();
    }

    public static void test2() throws IOException {
        test1();
    }

    public static void test3() throws IOException {
        test2();
    }

    // 不建議在main方法中丟擲異常   JVM負擔很重
    public static void main(String[] args) /*throws IOException*/ {
        try {
            show();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("------------------------------------");
        try {
            test3();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
三、編譯列印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=57577:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task16.ExceptionThrowsTest
java.io.FileNotFoundException: d:\a.txt (系統找不到指定的檔案。)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
    at com.yanqi.task16.ExceptionThrowsTest.show(ExceptionThrowsTest.java:10)
    at com.yanqi.task16.ExceptionThrowsTest.main(ExceptionThrowsTest.java:30)
java.io.FileNotFoundException: d:\a.txt (系統找不到指定的檔案。)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
    at com.yanqi.task16.ExceptionThrowsTest.show(ExceptionThrowsTest.java:10)
    at com.yanqi.task16.ExceptionThrowsTest.test1(ExceptionThrowsTest.java:16)
    at com.yanqi.task16.ExceptionThrowsTest.test2(ExceptionThrowsTest.java:20)
    at com.yanqi.task16.ExceptionThrowsTest.test3(ExceptionThrowsTest.java:24)
    at com.yanqi.task16.ExceptionThrowsTest.main(ExceptionThrowsTest.java:37)
------------------------------------

Process finished with exit code 0
四、異常丟擲補充:程式設計程式碼
package com.yanqi.task16;

import java.io.IOException;

public class ExceptionMethod {

    public void show() throws IOException {}
}
五、程式設計程式碼
package com.yanqi.task16;

import com.sun.jdi.ClassNotLoadedException;

import java.io.FileNotFoundException;
import java.io.IOException;

public class SubExceptionMethod extends ExceptionMethod {

    @Override
    public void show() throws IOException {} // 子類重寫的方法可以丟擲和父類中方法一樣的異常
    //public void show() throws FileNotFoundException {}  // 子類重寫的方法可以丟擲更小的異常
    //public void show() {} // 子類可以不丟擲異常
    //public void show() throws ClassNotLoadedException {} // 不可以丟擲平級不一樣的異常
    //public void show() throws Exception {} // 不可以丟擲更大的異常
}








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                    ——W.S.Landor



來自為知筆記(Wiz)