漲姿勢:Java 異常?嘗試自定義異常


1.異常

在Java中,每個異常都是一個名叫Throwable的類的一個實例

我們常用的try-catch-finally語句

  • try

嘗試去執行try語句塊里的內容,如果有異常,將其捕獲,並執行catch語句塊中的代碼

  • catch

在catch語句的參數中我們定義了具體的異常類型,但是這些具體的異常都是Exception的子類,所以我們可以通過將參數改為Exception e 來捕獲所有異常(但是不建議這么做,或者把捕獲異常基類放到最后,因為有的時候你需要針對不同的異常做出一些不同的動作)

  • finally

finally "最后",語句塊中的內容最后都會被執行

  • 處理異常

在捕獲了異常之后,我們還需要處理這些異常,我們可以將這些異常的消息輸出,或者在捕獲之后再拋出另外的異常: 常用的消息輸出方式就是getMessage()以及printStackTrace()

2. 自定義異常

官方給出的異常類型(JDK 8)大部分都是沒見過的,(羞羞

不要緊,我們可以自己來定義屬於自己的異常。

具體的異常都是繼承自Exception類,所以我們要自定義的異常也需要繼承這個基類。

我們自定義異常命名MyException,需要繼承基類Exception,然后我們調用基類的構造方法,帶一個參數:

public class MyException extends Exception {
   public MyException(String message){
       super(message);
   }
}

 

然后我們測試這個異常,因為是測試,所以直接拋出定義的異常:

public class Test {
    public static void main(String[] args)throws MyException{
        try{
            throw new MyException("自定義異常");
        }catch (MyException e){
            System.out.println(e.getMessage());
        }
    }
}

 

打印異常結果

3. 查看異常信息

有時候我們會需要查看異常信息來進行調試,JDK中給出了3種繼承自Throwable基類的方法

toString()方法

在講方法前我們先看看 Throwable類中覆蓋了的toString()方法:

image

這里面的意思是: toString()方法返回一個字符串,代表了Throwable實例(異常)的信息,具體格式為:對象名字: 本地化的信息

示例:

image

運行出來的結果第二行:

java.io.FileNotFoundException: test.txt(系統找不到指定的文件。)
at ...

 

java.io.FileNotFoundException就是Throwable的實例,text.txt...后面的信息就是本地化的信息了,針對不同的位置給出具體的信息,用來調試就能很快進行定位

 

getMessage() :

the detail message string of this Throwable instance (which may be null) 將Throwable實例(通常所說的異常)的具體信息以String類型給出(可能不存在) 

printStackTrace()

這個方法有三種類型:無參,帶參數PrintStream和帶參數PrintWriter

無參的printStackTrace()方法也就是我們平常使用的查看異常信息的方式,直接在控制台打印
帶參數PrintStream(打印輸出流):能夠將信息通過流輸出至其他地方,

做個測試:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException{
        OutputStream out;
        try{
            throw new RuntimeException();
        }catch (RuntimeException e){
            out = new FileOutputStream("C:\\Users\\94545\\Desktop\\test.txt");
            //將FileOutputStream作為PrintStream的輸出流
            PrintStream printStream = new PrintStream(out);
            e.printStackTrace(printStream);
            out.close();
            printStream.close();
        }
    }
}

 

成功打印

 
帶參數PrintWriter(字符打印輸出流):將信息輸出至其他地方
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception{
        OutputStream out;
        try{
            throw new RuntimeException();
        }catch (RuntimeException e){
            out = new FileOutputStream("C:\\Users\\94545\\Desktop\\test.txt");
            PrintWriter printWriter = new PrintWriter(out,true);
            e.printStackTrace(printWriter);
            out.close();
            printWriter.close();
        }
    }
}

 

打印成功!

擴展

你知道 throw和throws有什么區別?

舉個例子來說: 在方法A中,如果在產生異常的時候,不需要馬上捕獲,在方法B調用方法A的時候再進行捕獲,那么就在A的方法名后添加throws,如果需要在方法A中進行捕獲,則直接使用throw

所以兩者區別,其實在於究竟在哪個地方處理異常

小結

看捕獲異常的對象是誰,再決定應該如何來使用

用戶輸入數據的格式永遠都是正確的,選擇打開的文件也一定存在,並且永遠不會出現bug ——《Java核心技術 卷一》

 


免責聲明!

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



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