异常处理:try-catch-finally与throws的区别及使用情况
Error與Exception
Error:Java 虛擬機無法解決的嚴重問題。如: JVM系統內部錯誤、資源耗盡等嚴重情況。Error類對象由 Java虛擬機生成并拋出,大多數錯誤與代碼編寫者所執行的操作無關。
比如: StackOverflowError 和OOM(Out of memory Error)。一 般不編寫針對性的代碼進行處理。
eg:棧溢出、堆溢出、虛擬機運行錯誤等。
//Exception in thread "main" java.lang.StackOverflowError//1.棧溢出 // main(args);//2.堆溢出:java.lang.OutOfMemoryError // Integer[] arr = new Integer[1024*1024*1024];//1024*1024*1024個4字節Exception:其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理。
例如:
空指針訪問
試圖讀取不存在的文件
網絡連接中斷
數組角標越界等
1.異常的體系結構
java.lang.Throwable;* |---java.lang.Error;* |---java.lang.Exception;:可以進行異常的處理* |---編譯時異常(checked)* |---IOException* |---FileNotFoundException* |---ClassNotFoundException* |---運行時異常(unchecked)* |---NullPointerException* |---ArrayIndexOutOfBoundsException* |---ClassCastException* |---NumberFormatException* |---InputMismatchException* |---ArithmeticException // 算數異常
藍色:非受檢異常(unchecked)
紅色:受檢異常(checked)
2.從程序執行過程來看,分為:編譯時異常和運行時異常
3.異常處理:抓拋模型
過程一:== “拋”==:程序在正常執行過程中,一旦出現異常,就會在異常代碼處生成一個對應異常的對象并將此對象拋出。
一旦拋出對象以后,其后的代碼就不再執行。
過程二:“抓”:異常的處理方式:① try-catch-finally ② throws
4.異常處理方式一:
- try-catch-finally 的使用
eg:
String str = "123";str = "abc";//外面聲明int num = 0;try { // int num = Integer.parseInt(str);//里面使用num = Integer.parseInt(str);System.out.println("-----1");} catch (NumberFormatException e) { // System.out.println("出現數制轉換異常");//String getMessage():System.out.println(e.getMessage());//printStackATrace():e.printStackTrace();} catch (NullPointerException e) {System.out.println("出現空指針異常");} catch (Exception e) {System.out.println("Exception父類放后面");}System.out.println(num);//try結構里的不能調用System.out.println("-----2");說明:
1).finally是可選的;
2).使用try將可能會出現異常的代碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常的對象,根據此對象的類型,去catch中進行匹配;
3).一旦try中的異常對象匹配到某一個catch時,就進入catch中進行異常的處理,一旦處理完成,就跳出當前的try-catch結構(在沒有寫finally的情況下),繼續執行后面的代碼;
4).catch中的異常類型如果沒有子父類關系,誰先聲明無所謂; catch中的異常類型如果滿足子父類關系,則要求子類一定聲明在父類上面;否則,報錯;
5).常用的異常對象處理的方式:①String getMessage(): ②printStackATrace():
6).在try結構中聲明的變量,出了try結構之后,就不能被調用;可以在try外面先聲明,在try內部使用
7).try-catch-finally結構可以嵌套
注:①使用try-catch-finally處理編譯時異常,使得編譯時不再報錯,但運行時可能會出錯,相當于將一個編譯時可能出現的異常,延遲到運行時出現。
②開發中,由于運行時異常比較常見,所以我們通常不針對運行時異常編寫try-catch-finally,針對編譯時異常,一定要考慮異常處理。
5.異常處理方式二:
- throws + 異常類型
1).“throws + 異常類型”寫在方法的聲明處,致命此方法執行時,可能會拋出異常類型,一旦當方法體執行時出現異常,仍會在異常代碼出生成一個異常的對象,此對象滿足throws后的異常類型時,就會被拋出。異常代碼后續的代碼,就不再執行;
2).try-catch-finally:真正的將異常給處理掉了。
而throws方式只是將異常拋給了方法的調用者,并沒有真正將異常處理掉。
3).開發中如何選擇使用try-catch-finally還是使用throws?
a. 父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能夠使用throws,意味著如果子類重寫方法中有異常,必須使用try-catch-finally方式處理;
b. 執行額方法中,先后又調用了另外的幾個方法,這幾個方法是遞進關系的,我們建議這幾個方法使用throws的方式進行處理。而執行的方法a可以考慮try-catch-finally方式進行處理。
eg:
//main()中使用try-catch-finally結構,不然繼續throws給JVM,套死了public static void main(String[] args) {ExceptionTest2 test = new ExceptionTest2();try {test.method1();} catch (IOException e) {e.printStackTrace();}} public static void method1() throws FileNotFoundException, IOException{File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);//Unhandled exception: java.io.IOExceptiondata = fis.read();}fis.close();}tips:方法重寫的規則之一:子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型.
eg:
而要是在其他方法里調用method(),也必須處理異常,此時在main()之前/main()中直接try-catch-finally結構處理異常。
eg:
總結
以上是生活随笔為你收集整理的异常处理:try-catch-finally与throws的区别及使用情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14-5-13日记
- 下一篇: eclipse 拨打电话、拨号,发短信