一、使用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)