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()方法:
這里面的意思是: toString()方法返回一個字符串,代表了Throwable實例(異常)的信息,具體格式為:對象名字: 本地化的信息
示例:
運行出來的結果第二行:
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核心技術 卷一》