Java開發知識之Java的異常處理
Java開發知識之Java的異常處理
一丶異常概述
在講解異常之前,我們要搞清楚.什麽是異常. 通俗理解就是我們編寫的程序出問題了.進行處理的一種手段.
比如我們的QQ.有的時候就崩潰了.比如出現xxx錯誤.讓你上報錯誤信息什麽的. 意思就是 QQ的代碼不能運行了.
但是,直接崩潰又不好看.對用戶不好. 所以就用異常處理接受. 我彈出一個錯誤框.告訴你已經錯誤了.代碼不能運行了.讓你上傳或者重新啟動. 異常做的事情就是這樣.只能這樣做最後的一點事情.但是了解一下還是必須的.
1.異常說明
異常主要作用: 代碼超出了程序員可控範圍. 如用戶的數據出錯.導致程序出錯. 或者打開文件的時候.也會出錯.在程序中可能出現的這種錯誤.我們都稱之為異常.在C++ 中一樣有異常處理. 如果是底層.那麽會更復雜.在匯編的角度來說.
2.Java中的異常.
在程序編程中. 我們不能 除0. 除0就會有異常,在C++中內存訪問異常就是C0005; 我們可以編寫代碼,告訴大家什麽是異常.
public class JavaMain { public static void main(String[] args) { int Number = 10; int NumberCount = 10 / 0; } }
運行結果
這一串英文可以翻譯為:
異常 在線程 main中. java.lang.ArithemeticExeception 接受的 / 除 0 錯誤. 在 man函數的第16行位置.
可以準確的輸出.這個就是異常.異常一旦處理.代表了其程序已經不能執行了.不過你可以接受異常對其進行處理.比如我輸出一段話.
二丶異常的捕獲與處理
1.異常處理 try catch
我們上邊說過. 當異常產生的時候.我們可以進行處理.
語法:
try{ 會出現的異常代碼. } catch(Exception e){ 異常出現後我們進行捕獲. 進行你自己的操作.比如輸出一段話. } catch(Exception a){ ..... }
代碼如下:
public static void main(String[] args) { try { int Number = 10; int NumberCount = 10 / 0; } catch(Exception e) { String Error = e.getMessage(); e.printStackTrace(); } }
我們捕獲了異常. 任何異常都可以使用 Exception這個對象的引用來接受. 這個類就相當於異常的全局父類. 任何異常處理類都繼承它.所以可以用它接受一下.並且調用方法.輸出錯誤.
輸出結果:
註意: 如果我們使用的try語句中.有代碼出現了異常.那麽會去尋找對應的Catch語句進行處理.但是如果我們catch語句不輸出結果.或者不加代碼.那麽可能程序就與你的預期不對.因為以前不使用的時候.出了異常我們知道哪裏錯誤了.
但是現在你自己處理catch不輸出錯誤.這樣就會造成一種假象就是我的程序沒有出錯.但是為什麽運行結果不對. 因為已經除了異常了.但是你沒有進行處理而已.
2.異常處理語句 try catch finally
在C++中,標準的異常處理就是try catch .java中也可以這樣做.
但是此時可能遇到一個問題.如果我們已經知道出現異常了.但是想要釋放資源怎麽辦.所以使用另一種 java的處理語句
語法;
try{ } catch(Exception e){ } finally{ }
finally的作用就是,不過try catch語句怎麽執行.最終都會執行finally語句的.
執行流程:
try捕獲異常. 交給 catch處理. catch處理完了. 指向finally語句.
三丶Java中的常見處理類.
例如上面的我們 除0異常.就是算數異常.我們可以使用此類進行接收.
四丶自定義異常與異常拋出
用戶可以自定義異常.並且出現了異常.可以拋出這個異常.
1.繼承父類 Exception 類.
2.使用throw語句. 方法上使用throws語句.
1.繼承父類.
public class MyException extends Exception { public MyException() { // TODO 自動生成的構造函數存根 } public MyException(String message) { super(message); // TODO 自動生成的構造函數存根 } public MyException(Throwable cause) { super(cause); // TODO 自動生成的構造函數存根 } public MyException(String message, Throwable cause) { super(message, cause); // TODO 自動生成的構造函數存根 } public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO 自動生成的構造函數存根 } }
我們可以只實現一個構造. 不過我使用的Exception進行繼承的.它會自動重寫父類的信息.
此時我們就有了一個異常類. 叫做MyException類.
2.創建方法.拋出自定義異常.
我們創建一個類.這個類中創建一個方法.方法裏面是處0錯誤.我們自定義處理.
public class MyTest { public MyTest() { // TODO 自動生成的構造函數存根 } public static void ExceptionRun()throws MyException{ try { int a = 10; int b = 11; if ((a + b) >= 21) { throw new MyException("數字大了"); } } catch (MyException a) { System.out.println(a.toString()); } } }
1.我們方法中寫了程序. 如果 數字 > 21.我們就拋出異常.如果我們有catch語句接受.則進行輸出了. catch語句的類就是我們的異常類. 也可以是它的父類.
2.方法上加了 throws.意思就是說. 如果這個方法出了異常.且catch語句中並沒有捕獲到.那麽就會上層進行異常捕獲.也就是說上層需要加上try catch 來使用這個方法.
如果上層不使用. 那麽上層函數繼續使用throws進行拋出. 如果都沒有處理.則Java自動進行處理.直到程序出錯.
如下:
我們的上層函數調用位置.並沒有使用try catch進行捕獲.繼續拋出了.
throw: 這個主要用於拋出異常對象.一旦程序遇到throw則代碼不會繼續執行了.
throws: 用在方法中. 主要是當前方法沒有捕獲異常.就會拋出.讓上一層進行接收.
五丶異常跟錯誤的區別.
Java中有運行時異常. 我們上面所說的Exception 是所有異常的"父類" 針對的是異常.其實它也是一個子類. 而它的父類派生出了錯誤類 Error 跟 異常類 (Exception)而已.
流程圖:
異常跟錯誤:
異常指的就是程序出問題了.不過還可以補救.錯誤就是你代碼都寫錯了.程序都不能運行. 或者這類錯誤很嚴重.會直接消耗進系統資源.造成無法挽回的損失.
六丶總結
1.異常的所有父類 Exception接受.
2.異常語法 : try catch(異常類. 引用) try catch(異常類,異常引用) finally
3.自定義異常繼承 Exception即可. 使用throw拋出.
4.throw語句拋出異常引用對象.catch中接受我們的異常. throws用於方法.代表當前方法並沒有捕獲到異常.傳遞給上一層進行處理.上一層調用trycatch如果不調用繼續throws. thrwos可以拋出多個異常.
5.異常跟錯誤.
1.異常 exception 非嚴重性的.
2.錯誤:: error 嚴重性的.
Java開發知識之Java的異常處理