異常處理的兩種方式


一、使用throws關鍵字,聲明異常,交給方法的調用者處理,最終交個JVM處理(中斷處理)

JVM中斷處理,后面的后續代碼就不會執行了。
throws使用格式:
當一個方法拋出了異常,就在方法聲明時使用throws關鍵字,將異常交給方法調用者處理

修飾符 返回值類型 方法名(參數列表) throws AAAException, BBBException {
    //method body
}

注意:1、如果throws的多個異常是子父類關系,那么就只用聲明父類
2、調用了聲明異常的方法,那么就必須處理這些聲明的異常,要么是繼續throws,交給別人處理,要么就try...catch自己處理

package cn.zhuobo.day12.aboutException;

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

public class Demo01Throws {
    public static void main(String[] args) throws IOException {// main調用了聲明異常的方法,可以選擇繼續聲明異常,繼續拋出異常給main的調用者也就是JVM處理
        readFile("c:a.taxt");
    }
// 這是這三個異常的繼承關系:FileNotFoundException extends IOExcetion Exception,因此拋出了兩個異常就只用聲明父類異常
    public static void readFile(String fileName) throws IOException {
        if(!fileName.equals("c:a.txt")) {
            throw new FileNotFoundException("文件路徑不是c:a.txt");
        }
        if(!fileName.endsWith(".txt")) {
            throw new IOException("后綴名不是txt");
        }
        System.out.println("讀取文件");// 如果不符合拋出異常的條件,那么就執行這句話
    }
}

二、異常的第二種處理方式,捕獲異常try......catch

格式:

try {
    可能產生異常的代碼
}catch(定義一個異常的變量,用來接收try中拋出的異常對象) {
    異常的處理邏輯,接收異常對象之后怎么處理異常,一般在工作中
    會把異常記錄到一個日志中
}
...// 多個catch
catch(異常類名 變量名) {
    try可能拋出多個異常,可以使用多個catch
}finally {
            System.out.println("這里的代碼無論是否出現異常都會執行,一般用於資源回收");
            //  finally代碼塊不能單獨使用,和try catch一起使用
            // 如果finally代碼塊里有return語句,那么永遠返回finally中的結果,應該避免在finally中寫return語句
}

后續代碼

注意
1、try可能回拋出多個異常對象,可以使用多個catch處理這些異常
2、try產生了異常就執行相對應的異常處理邏輯,之后繼續執行后續代碼
3、沒有產生異常就不執行catch,執行完try后,執行后續代碼

package cn.zhuobo.day12.aboutException;

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

public class Demo02TryCatch {
    public static void main(String[] args) {//這里沒有throws聲明拋出異常
        try {
            // 可能產生異常的代碼
            readFile("sss");
        }catch (IOException e) {// try里拋出什么異常對象,catch就聲明什么異常變量,接收拋出的異常
            // 異常的處理邏輯
            System.out.println("后綴名不是txt");
        }
        //與throws不同的是,自己try catch處理異常,不是交個方法調用這JVM處理,就不會中斷處理,后續代碼可以繼續執行
        System.out.println("這些都是后續的代碼");
    }

    public static void readFile(String fileName) throws IOException {// 如果結尾不是txt,這個方法會產生一個異常對象
        if(!fileName.endsWith(".txt")) {
            throw new IOException("后綴名不是txt");
        }
    }
}

三、Throwable類中定義了三個異常處理方法

String getMessage():返回此 Throwable 的簡短描述
String toString():返回此 Throwable 的詳細消息字符串
void printStackTrace():JVM打印異常對象,默認使用這個方法,這是最詳細的異常信息

// 可以在catch使用這三個方法,打印異常信息

catch (IOException e) {// try里拋出什么異常對象,catch就聲明什么異常變量,接收拋出的異常
            // 異常的處理邏輯
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            e.printStackTrace();
        }

Output:異常信息一個比一個詳細

后綴名不是txt// getMessage
java.io.IOException: 后綴名不是txt// toString
java.io.IOException: 后綴名不是txt// printStackTrace
	at cn.zhuobo.day12.aboutException.Demo02TryCatch.readFile(Demo02TryCatch.java:23)
	at cn.zhuobo.day12.aboutException.Demo02TryCatch.main(Demo02TryCatch.java:10)


免責聲明!

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



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