Java基礎 異常處理

2021-09-11 03:49:28 字數 3389 閱讀 1008

所有異常的父類,其下有兩個分支,乙個是 error,乙個是 exception;

throwable 類中有三個常用的方法:

public void printstacktrace() 輸出異常資訊以及堆疊跟蹤資訊;

public string getmessage() 輸出異常內容;

public string tostring() 輸出異常類+異常內容;

是程式不可修復的錯誤,例如記憶體溢位,資源耗盡。所以異常處理基本上不考慮 error 的情況。

是程式可以修復的錯誤。exception 又分為執行時異常和編譯異常。

exception 有個子類叫runtimeexception,它是所有執行異常的父類;exception 剩下的直接子類都屬於編譯異常;

執行時異常

有部分異常是當程式執行過程中,才丟擲來的。例如我們熟悉的nullpointerexceptionindexoutofbound***ception,常常由於程式設計師的疏忽,或者一些不可預知的情況,控制台能看到這些異常。

所以執行異常有個特點

方法內部如果丟擲的是執行時異常,方法上既無需宣告,程式設計師也無需捕捉。為什麼呢?

因為執行時異常屬於必須修復的錯誤。一旦發生,程式設計師需要修改源**,修復這種執行時異常,所以既不用捕捉,也無需丟擲宣告。畢竟一旦發生,後面的**已經沒有意義了。

比如經常遇到乙個變數報了乙個空指標異常,後面的業務中還需要用到這個變數,但是這個變數都不存在,所以後面的**也就沒有了執行下去的意義。

編譯異常

又叫受檢查異常,程式在編譯階段,編譯器會檢查這類異常是否進行了異常處理。

像我們呼叫過的日期轉換public date parse(string source) throws parseexception,或者jsonobject 裡面的 prase 方法。我們在呼叫這些方法的時候,編譯器就會報錯提醒我們有異常需要處理。

編譯異常有兩種處理方式。一種是在方法後面新增throws***exception,將異常處理拋給呼叫者處理;另外一種是方法本身通過 try…catche來處理異常。

用於方法上,例如public date parse(string source) throws parseexception,在方法的最後面加上 throws ***exception,這種方式,異常一但丟擲,方法本身不需要處理異常,由方法的呼叫者來選擇,呼叫者可以繼續throws或則用try…catch捕捉。如果一直 throws 的話,最終的呼叫者是jvm

try **塊裡面是可能拋異常的**;

catch **塊,如果真的有異常了,就會進到這個**塊;

finally **塊,必須執行的**塊,無論是否拋異常;除非**呼叫了 system.exit();通常用來關閉資源,比如說 io 流、檔案流、網路流;

注意事項

try 中的宣告的變數有作用域問題;

多 catch 處理異常的時候,平級關係的異常沒有順序,有上下級關係的,上級放後面;

例如:catch(nullpointerexception e){}catch(runtimeexception e){}catch(parseexception e){}

parseexception 是編譯異常,跟前兩個異常沒有關係,所以放哪都行;

nullpointerexception 是 runtimeexception 的子類,但前者不能放在後者後面,一是程式不允許,二是如果 runtimeexception 放前面,只要是 runtimeexception 的子類都會進去,當真的是 nullpointerexception 的時候,還是會進 runtimeexception,所以 catch(nullpointerexception e){} 就沒有意義了。

使用 throws 的話,假設方法體有 10 行**,當在第五行**丟擲了異常,那麼第 6 行**及往後的**都不會執行了。

使用 try…catch 的話,

假設 try **塊中有 5 行,當在第二行發生了異常,try 中剩下的 3 行**將不執行,會進入到 catch **塊;

只要捕捉並且處理完異常,跳出 try…catch 後面剩下多少行**都將繼續執行。

如果父類的方法上有宣告異常,子類重寫父類的方法後,重寫的方法上可以不宣告異常;如果要重寫的方法要宣告異常,異常不能大於父類的異常;

如果父類的方法上沒有拋異常,子類重寫父類的方法,也不能拋異常,只能通過 try…catch 處理異常

throw new ***exception(「異常資訊」)

手動丟擲異常,可以隱藏具體異常資訊,可以很友好的告訴呼叫者括號裡面的 異常資訊。

自定義的異常類需要繼承 exception 及其子類或者 runtimeexception 及其子類。

自定義異常一般需要提供兩個構造方法,乙個是無參的構造方法,另乙個是傳乙個string message 的有參構造方法,並且呼叫super(message);

我們在 finally **塊,通常用來關閉資源,有時可能要關閉的資源很多,畢竟每關閉乙個資源都有乙個 try…catch;

所以在 jdk7 提供了乙個自動資源管理的技術。可以替代 finally **塊,優化**結構,提高可讀性;

在 try 語句後面填一對小括號(),括號裡面宣告或初始化資源語句,如有多條語句則用分號隔開;

例如try (fileinputstream readfile = new fileinputstream(「readme.txt」);

inputstreamreader ir = new inputstreamreader(readfile);

bufferedreader in = new bufferedreader(ir)) catche(exception e){}

括號裡宣告初始化了三個輸入流,這就是自動資源管理技術,使用此技術之後,可以不寫 finally,不需要自己 close 資源,釋放資源的過程就交給了 jvm;

不過要注意的是,所有可以自動管理的資源需要實現autocloseable介面;

看個例子:

public abstract class inputstream implements closeable{}

public inte***ce closeable extends autocloseable{}

public inte***ce autocloseable{}

Java基礎 異常處理 常用類

異常處理 關鍵字 try catch throws throw finally 宣告方法丟擲異常 查jdk public void somemethod throws someexception 包含 段 呼叫方法處理異常 方法未處理,只丟擲異常 trycatch someexception e c...

java語言基礎 77 異常處理

程式問題類結構 頂級類 throwable 子類,嚴重問題 error 子類,問題 exception 編譯時異常 非runtimeexception都是編譯時異常 執行時異常 runtimeexception 異常處理方式 1 try.catch.finally 格式 trycatch 異常型別 ...

java基礎篇之異常處理

概述 checked異常體系 unchecked 所有的runtimeexception 及其子類 統稱 runtime異常,例如arrayindexoutofbound ception,nullpointerexception,這樣的異常,也可以不處理。對於這些異常,我們應該修正 而不是去通過異常...