Java異常處理掃盲貼

Throwable類是Java語言所有錯誤或異常的超類(兩個直接子類:Error和Exception)

Java異常處理掃盲貼

Error vs Exception

Java程序在執行過程中所發生的異常事件可分為兩類:

Error:Error類對象由Java虛擬機生成并拋出,大多數錯誤與代碼編寫者所執行的操作無關。例如,Java虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的內存資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;還有發生在虛擬機試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、鏈接錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行時不允許出現的狀況。對于設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在Java中,錯誤通常是使用Error的子類描述。
Exception:在Exception分支中有一個重要的子類RuntimeException(運行時異常),該類型的異常自動為你所編寫的程序定義ArrayIndexOutOfBoundsException(數組下標越界)、NullPointerException(空指針異常)、ArithmeticException(算術異常)、MissingResourceException(丟失資源)、ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生;而RuntimeException之外的異常我們統稱為非運行時異常,類型上屬于Exception類及其子類,從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

Error和Exception的區別:Error通常是災難性的致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程序處理的,并且在程序中應該盡可能的去處理這些異常。

檢查異常vs不受檢查異常

檢查異常:在正確的程序運行過程中,很容易出現的、情理可容的異常狀況,在一定程度上這種異常的發生是可以預測的,并且一旦發生該種異常,就必須采取某種方式進行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于檢查異常,當程序中可能出現這類異常,要么使用try-catch語句進行捕獲,要么用throws子句拋出,否則編譯無法通過。

不受檢查異常:包括RuntimeException及其子類和Error。

不受檢查異常為編譯器不要求強制處理的異常,檢查異常則是編譯器要求必須處置的異常。

異常處理關鍵字

Java異常處理涉及到五個關鍵字,分別是:try、catch、finally、throw、throws。

  • try: 用于監聽。將要被監聽的代碼(可能拋出異常的代碼)放在try語句塊之內,當try語句塊內發生異常時,異常就被拋出。

  • catch:用于捕獲異常。catch用來捕獲try語句塊中發生的異常。 —finally:finally語句塊總是會被執行。它主要用于回收在try塊里打開的物力資源(如數據庫連接、網絡連接和磁盤文件)。只有finally塊,執行完成之后,才會回來執行try或者catch塊中的return或者throw語句,如果finally中使用了return或者throw等終止方法的語句,則就不會跳回執行,直接停止。

  • throw:用于拋出異常。

  • throws:用在方法簽名中,用于聲明該方法可能拋出的異常。

注意:try后面如果跟多個catch,那么小范圍的異常放前面,大范圍的異常放后面(根據多態的原理,如果大的放前面,就會將所有的子類對象接收,后面的catch就沒有意義了)

常見問題

final、finally、finalize的區別

  • final 可以用來修飾類、方法、變量,分別有不同的意義,final 修飾的 class 代表不可以繼承擴展,final的變量是不可以修改的,而final的方法也是不可以重寫的(override)。

  • finally 則是Java保證重點代碼一定要被執行的一種機制。我們可以使用 try-finally 或者 try-catch-finally 來進行類似關閉 JDBC 連接、保證 unlock 等動作。

  • finalize是基礎類 java.lang.Object的一個方法,它的設計目的是保證對象在被垃圾收集前完成特定資源的回收。finalize 機制現在已經不 推薦使用,并且在 JDK 9 開始被標記為 deprecated。

需要關閉的連接等資源時,相比finally,更推薦使用Java 7中添加的try-with-resources語句,因為通常Java平臺能夠更好地處理異常情況,編碼量也要少很多。如果確實需要額外處理,可以考慮 Java 提供的 Cleaner 機制或者其他替代方法。

如果在執行到finally之前JVM退出了,比如System.exit(0)),則finally代碼不會執行

如果catch里面有return語句,finally里面的代碼還會執行嗎?

代碼示例:


class FinallyDemo {

public static void main(String[] args) {

System.out.println(getInt());

}


public static int getInt() {

int a = 10;

try {

System.out.println(a / 0);

a = 20;

} catch (ArithmeticException e) {

a = 30;

return a;

} finally {

a = 40;

return a+1;

}

// return a;

}

}

上面的實驗代碼可以解答所有問題。

  1. 如果finally沒有return的話,catch在運行return之前將會運行finally的邏輯,然后再跳轉回catch的return,輸出30。

  2. 如果finally如果有return的話,catch在運行return之前會運行finally的邏輯,然后直接運行finally的return,輸出41。

異常注意事項

  1. 子類不能拋出父類沒有的異常。子類拋出的的異常與父類拋出的異常相同或者是父類拋出的異常的子類

  2. 如果父類中被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常。如果子類中有異常發生,那么子類只能try,不能throws

Java異常處理掃盲貼

喜歡就點個“在看”唄 ^_^ Java異常處理掃盲貼

原文 

http://mp.weixin.qq.com/s?__biz=MzUyNzgyNzAwNg==&mid=2247483815&idx=1&sn=04be4809fe6e505031e3cc84112aac9a

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。

PS:推薦一個微信公眾號: askHarries 或者qq群:474807195,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

轉載請注明原文出處:Harries Blog? » Java異常處理掃盲貼

贊 (0)
分享到:更多 ()

評論 0

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
2013平特肖公式