日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java的Exception異常機制

瀏覽:15日期:2022-08-11 15:05:02
目錄一、前言二、關于RuntimeException三、異常的避免四、異常的捕獲五、異常的拋出(異常的轉移)六、自定義異常一、前言

在Java中,我們在執行代碼的過程中難免會遇到錯誤與Exception異常,可是我們一直都是錘頭Coding而忽略了學習Exception這個東西!我們只是知道在發生Exception的地方讓代碼自動生成throw exception或者是使用try-catch括起來處理,那你了解Java的Exception嗎?今天就讓我們把一起來看看Java的Exception吧!

在Java中,我們的代碼再出現錯誤的時候無非是兩種情況:一是Error,一是異常Exception。如果是Error,那么則說明出現了錯誤,錯誤出現在編譯器預編譯階段,錯誤是可以預見的,而異常卻是無法預見的。Java中,無論是Error還是Exception都是Throwable的子類(見下圖)。這是個什么玩意兒,可能大部分的人都沒人聽說過吧…不過這并不重要…開始上圖…

詳解Java的Exception異常機制

Error與Exception的區別與相同點:

Error是嚴重的錯誤,并非異常,錯誤是無法通過編碼解決的。 Exception是異常,異常則是可以通過編碼解決的。

Error與Exception的相同點:

Error與Exception類都是Throwable的子類

Exception類是所有異常的超類。

Java所有的異常在尋找父類的時候最終都能找到Exception類。

異常的分類

java.lang.Exception類是所有異常的超類,主要分為以下兩種:

RuntimeException-運行時異常,也叫作非檢測性異常.

lOException和其它異常-其它異常,也叫作檢測性異常,所謂檢測性異常就是指在編譯階段都能被編譯器檢測出來的異常。其中RuntimeException類的主要子類?ArithmeticException類-算術異常,ArraylndexOutOfBoundsException類-數組下標越界異常,NullPointerException-空指針異常,ClassCastException-類型轉換異常,NumberEormatException-數字格式異常注意:當程序執行過程中發生異常但又沒有手動處理時,則由Java虛擬機采用默認方式處理異常,而默認處理方式就是?打印異常的名稱、異常發生的原因、異常發生的位置以及終止程序。

二、關于RuntimeException

非檢測性異常

package com.sinsy.exception;public class ExceptionTest { public static void main(String[] args) {// 非檢測性異常 : Exception in thread 'main' java.lang.ArithmeticException: / by zero jvm無法檢測System.out.println(5 / 0);//檢測型異常Thread.sleep(3000); }}

詳解Java的Exception異常機制

RuntimeException的主要子類有:

ArithmeticException?算數異常 ArrayIndexOutOfBoundsException?數組下標越界異常 NullPointerException?空指針異常 ClassCastException?類型轉換異常 NumberFormatException?數字格式異常

下面通過代碼來對異常做出解釋:

詳解Java的Exception異常機制

為了讓所有的異常都能正常的顯示出來,我這里對每一種異常使用多線程來打印輸出:

package com.sinsy.exception;public class ExceptionTest { public static void main(String[] args) throws Exception {// 非檢測性異常 : Exception in thread 'main' java.lang.ArithmeticException: / by zero jvm無法檢測// System.out.println(5 / 0);//檢測型異常//Thread.sleep(3000);exceptionTest(); } public static void exceptionTest(){ new Thread(new Runnable() { @Override public void run() { //第一種 數組下標越界異常 int arr[] = new int[5]; System.out.println(arr[5]); } }).start();new Thread(new Runnable() { @Override public void run() {//算數異常int a = 1;int b = 0;System.out.println(a/b); }}).start();new Thread(new Runnable() { @Override public void run() {//空指針異常String abc = null;System.out.println(abc.length()); }}).start();new Thread(new Runnable() { @Override public void run() {//類型轉換異常Exception exception = new Exception();InterruptedException interruptedException =(InterruptedException) exception; }}).start();new Thread(new Runnable() { @Override public void run() {//數字格式異常String ad = '1234a';System.out.println(Integer.parseInt(ad)); }}).start(); }}

運行之后的結果為:很清晰的看見,每一個線程代表著一種異常。

詳解Java的Exception異常機制

通過編碼對各種異常進行處理之后,結果為:

/** * 測試各種異常轉換機制的修復 */public static void exceptionModifyTest(){ new Thread(() -> {//第一種 數組下標越界異常int arr[] = new int[5];if (arr.length>5){System.out.println(arr[5]);}System.out.println('下標越界異常已經規避'); }).start(); new Thread(new Runnable() {@Overridepublic void run() { //算數異常int a = 1;int b = 0;if (0!=b){System.out.println(a/b);} System.out.println('算術異常已經規避');} }).start(); new Thread(() -> {//空指針異常String abc = null;if (null!=abc) { System.out.println(abc.length());}System.out.println('空指針異常已經規避'); }).start(); new Thread(() -> {//類型轉換異常Exception exception = new Exception();if (exception instanceof InterruptedException) { InterruptedException interruptedException = (InterruptedException) exception;}System.out.println('類型轉換異常已經規避'); }).start(); new Thread(() -> {//數字格式異常String ad = '1234a';//字符串類型的數據做篩選一般選擇正則表達式做第一選擇if (ad.matches('d+')){System.out.println(Integer.parseInt(ad));}System.out.println('數字格式異常已避免'); }).start();}

運行結果為:

詳解Java的Exception異常機制

三、異常的避免

異常的避免其實上文已經凸顯出來了結局方案,就是在可能出現異常的地方進行if判斷處理,提前預判異常,然后對可能出現的異常跳過處理。

異常的避免(使用If-else)可能會導致大量的代碼冗余,導致代碼的沉積度過大,變得臃腫,可讀性比較差。

四、異常的捕獲

異常的捕獲使用try{}catch{}來進行捕獲

捕獲不了的我們對其進行拋出

五、異常的拋出(異常的轉移)

異常拋出拋給誰呢?當然是異常的捕獲者。

異常拋出的時候需要注意一點,拋出的異常之間有父子類繼承關系的,如果跑的異常包含多個,那么我們可以選擇拋出異常最大的父類,直接可以拋出所有異常,這樣節省了代碼,但同時也對代碼的可讀性造成了一定的影響,讓修改者無法直接得知此代碼在使用過程中會出現什么樣的異常。

基本概念

在某些特殊情況下有些異常不能處理或者不便于處理時,就可以將該異常轉秘給該方法的調用者,這種方法就叫異常的拋出,本質上其實是異常的轉移。方法執行時出現異常,則底層生成一個異常類對象拋出,此時異常代碼后續的代碼就不再執行。

語法格式

訪問權限返回值類型方法名稱(形參列表) throws異常類型1,異常類型2…{方法體;}如?public void show() throws lOExceptiont

方法重寫的原則

a.要求方法名相同、參數列表相同以及返回值類型相同,從jdk1.5開始支持返回子類類型;b.要求方法的訪問權限不能變小,可以相同或者變大;c.要求方法不能拋出更大的異常;

注意

子類重寫的方法不能拋出更大的異常、不能拋出平級不一樣的異常,但可以拋出一樣的異常、更小的異常以及不拋出異常。一定注意!!!!!!!!!!若父類中被重寫的方法沒有拋出異常時,則子類中重寫的方法只能進行異常的捕獲。不建議在Main方法中拋出異常,JVM需要執行的任務有很多,如果此時將大量的異常工作交給他來做,那么會影響JVMd額執行效率

異常的常規處理

對于常見的異常,通常對不同類型的異常有著不同的處理方法.

(1)如果父類方法拋出了異常,子類不能拋出比父類更大的異常,只能拋出與父類所拋異常類子類的異常,特殊情況可不拋出任何異常。

父類拋出InterruptedException與IOException,子類只拋出InterruptedException,不拋出IOException

/** * 父類 */package com.sinsy.test;import java.io.FileInputStream;import java.io.IOException;public class ThrowExceptionFather { public void show() throws IOException, InterruptedException {Thread.sleep(100);System.out.println('hehehe');FileInputStream fileInputStream =new FileInputStream('');fileInputStream.close(); }}/** * 子類 */package com.sinsy.test;public class ThrowExceptionTest extends ThrowExceptionFather{ @Override public void show() throws InterruptedException {Thread.sleep(20); }} 父類的原始方法只拋出IOExeption,而子類在重寫該方法的時候拋出父類中沒有的異常,并且該異常與父類所拋異常并非同屬某一類的子類,也就是說子類所拋出的異常與父類所拋出的異常并不是同一級。

/** * 父類 */package com.sinsy.test;import java.io.FileInputStream;import java.io.IOException;public class ThrowExceptionFather { public void show() throws IOException {FileInputStream fileInputStream =new FileInputStream('');fileInputStream.close(); }}/** * 子類 */package com.sinsy.test;public class ThrowExceptionTest extends ThrowExceptionFather{ @Override public void show() throws InterruptedException {Thread.sleep(20); }}

此時代碼報錯,證明子類無法拋出與父類非同級關系的異常:

詳解Java的Exception異常機制

父類只拋出一個異常,子類拋出與父類所拋異常同級但不同的異常:如下代碼:子類拋出了一個與父類方法中同級別的異常但父類并未拋出該異常,此時代碼報錯:證明子類不可拋出與父類同級別的異常:(ClassNotLoadedException與IOException屬于同一級別)

/** * 父類 */package com.sinsy.test;import com.sun.jdi.ClassNotLoadedException;import java.io.FileInputStream;import java.io.IOException;public class ThrowExceptionFather { public void show() throws IOException {FileInputStream fileInputStream =new FileInputStream('');fileInputStream.close(); }}/** * 子類 */package com.sinsy.test;import com.sun.jdi.ClassNotLoadedException;public class ThrowExceptionTest extends ThrowExceptionFather{ @Override public void show() throws ClassNotLoadedException { }}

詳解Java的Exception異常機制

但是子類可以拋出一個是父類所拋異常類的子類的異常:

詳解Java的Exception異常機制

通過對比IOException的簡單繼承關系我們可以選擇一個IOException的子類,讓繼承了ThrowExceptionFather的子類在方法重寫的時候去拋出該異常,如下代碼:

package com.sinsy.test;import com.sun.jdi.ClassNotLoadedException;import java.nio.file.FileSystemException;public class ThrowExceptionTest extends ThrowExceptionFather{ @Override public void show() throws FileSystemException { }}

此時未報錯:

詳解Java的Exception異常機制

證明,子類可以拋出父類所拋異常類子類的異常。

因此,總結一句話就是:子類繼承父類后,在重寫父類方法的時候,如果父類中原有方法拋出了異常,那么子類不能拋出比父類所拋異常大的異常,只能拋出屬于父類所拋異常類的子類的異常。

(2)若一個方法內部以遞進式的方法分別調用了好幾個其他的方法,則建議這些方法將異常逐層拋出,然后再統一處理。如下代碼所示。

package com.sinsy.test;public class DigonThrow { public static void yu() {try { yu1();} catch (Exception e) { e.printStackTrace();} } public static void yu1() throws Exception {yu2(); } public static void yu2() throws Exception {yu3(); } public static void yu3() throws Exception {yu4(); } public static void yu4() throws Exception { yu5(); } public static void yu5()throws Exception{System.out.println(1); } public static void main(String[] args){yu(); }}

將異常拋至最頂層的時候,此時做最后的 try-catch 處理。

(3)如果父類中被重寫的方法沒有拋出異常的時候,則子類中重寫的方法只能進行異常的捕獲處理。

//父類代碼package com.sinsy.test;public class ThrowExceptionFather { public void show(){ }}//子類代碼package com.sinsy.test;import java.io.FileInputStream;import java.io.IOException;public class ThrowExceptionTest extends ThrowExceptionFather{ @Override public void show() {FileInputStream fileInputStream =new FileInputStream('');fileInputStream.close(); }}

若此時子類拋出異常,則會出現以下警示:

Method ‘show’ is inherited.Do you want to add exceptions to method signatures in the whole method hierarchy?意思就是在說,方法‘Show’是繼承的。要在整個方法層次結構中向方法簽名添加異常嗎?如果添加了之后,則父類中過就會拋出此異常!

詳解Java的Exception異常機制

六、自定義異常

基本概念

當需要在程序中表達年齡不合理的情況時,而Java官方又沒有提供這種針對性的異常,此時就需要程序員自定義異常加以描述。

實現流程

a.自定義xxxException異常類繼承Exception類或者其子類。b.提供兩個版本的構造方法,一個是在·無參構造方法,另外一個是字符電作為參數的構造方法。

異常的產生

throw new異常類型(實參);如∶throw new AgeException('年齡不合理!!! ');Java采用的異常處理機制,是將異常處理的程序代碼集中在一起,與正常的程序代碼分開**,使得程序簡潔、優雅,并易于維護。**

自定義Exception異常類

要想實現自定義Exception異常類,我們需要寫一個Exception的異常類去繼承Exception類,實現無參構造方法以及有參數構造方法。

package com.sinsy.exception;public class AgeException extends Exception{static final long serialVersionUID = -3387516993124229948L; /** * 無參數構造方法 */ public AgeException() { } /** * 有參構造方法 * @param message */ public AgeException(String message) {super(message); }} 自定義Exception異常類的使用:

(1)首先確定應用場景為:用戶個人信息的封裝中,對成員屬性的封裝的時候對成員屬性的設置出現異常:

package com.sinsy.bean;import com.sinsy.exception.AgeException;import java.util.Objects;public class Person { private String name; private String sex; private int age; public Person() { } public Person(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age; } public String getName() {return name; } public void setName(String name) {this.name = name; } public String getSex() {return sex; } public void setSex(String sex) {this.sex = sex; } public int getAge() {return age; } public void setAge(int age) throws AgeException {if (age<0){ throw new AgeException('年齡設置錯誤哦!請稍后重試!');}else{ this.age = age;} } @Override public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name) && Objects.equals(sex, person.sex); } @Override public int hashCode() {return Objects.hash(name, sex, age); } @Override public String toString() {return 'Person{' +'name=’' + name + ’’’ +', sex=’' + sex + ’’’ +', age=' + age +’}’; }}

(2)確定引用場景之后,我們創建Test測試方法對目標用例進行簡單測試:

package com.sinsy.test;import com.sinsy.bean.Person;import com.sinsy.exception.AgeException;public class PersonException { public static void main(String[] args) {Person person = new Person('二狗子');try { person.setAge(-12);}catch (AgeException ageException){ ageException.printStackTrace();}System.out.println('執行完畢'); }}

測試結果如下:

詳解Java的Exception異常機制

這表明,AgeException的異常類使用正確,正確的打印出來了錯誤提示信息,這里的錯誤提示信息是自己自定義的,也就是你在調用AgeException類的時候自己輸入的異常提示信息。這就是調用了AgeExceptiuon類的默認含參數的構造方法。

注意含有異常處理的代碼執行順序:

在遇到異常的時候我們需要根據異常出現的具體應用場景作相應的處理,如果是重寫父類的繼承下來的方法,我們在對方法進行重寫的時候,我們需要注意,如果父類的原始方法并沒有拋出異常,在子類中重寫父類的方法是不需要拋出異常的,否則則會報錯,而在處理異常的時候,我們更需要關注的是異常出現的位置以及時機。如果異常出現在可預測區域,則主動應該拋出對應可能會出現的異常,讓代碼安全的執行,不產生額外的錯誤。其二,在處理異常的時候,如果是遞進式拋出異常,在最頂層的時候一定要try-catch處理異常,不可再向上拋出,如果拋給虛擬機來處理,那么則會響應JVM的執行效率。其三,當處理異常的時候,如果我們遇到與異常耦合度不高的業務需要執行的時候,我們可以在finally中編寫與異常無耦合度的代碼,確保必要的有業務能正常執行。

處理異常的時候由于finally與try-catch的關系,有時候會打亂原有代碼的執行順序,也會間接影響業務的執行:比如以下處理方法的不同導致在業務最后的結果完全不一致。代碼如下

package com.sinsy.test;import com.sinsy.bean.Person;import com.sinsy.exception.AgeException;public class PersonException { public static void main(String[] args) {Person person = new Person('二狗子');//注意我這里的處理異常的方式方法: 是在最頂層拿到異常之后直接當場做的處理,try { person.setAge(-12);}catch (AgeException ageException){ //這里就是處理 直接將異常打印輸出 ageException.printStackTrace();}System.out.println('執行完畢'); }}

處理之后的結果為:

詳解Java的Exception異常機制

**而如果我們將代碼做一個簡單的修改:**在設置年齡的2時候我們不對錯誤年齡進行拋出異常處理而是直接就地處理。則會怎么樣呢?為了讓效果更加明顯,我們將SetAge的方法修改完之后我們再繼續將測試方法中測試用例做一個簡單的更改:

public void setAge(int age) { if (age<0){ try { throw new AgeException('年齡設置錯誤哦!請稍后重試!'); }catch (AgeException ageException){ ageException.printStackTrace(); } }else{this.age = age; }}//測試方法:package com.sinsy.test;import com.sinsy.bean.Person;import com.sinsy.exception.AgeException;public class PersonException { public static void main(String[] args) {Person person = new Person('二狗子','男');//注意我這里的處理異常的方式方法: 是在最頂層拿到異常之后直接當場做的處理,person.setAge(-12);System.out.println(person); }}

最后的處理結果:

詳解Java的Exception異常機制

我們發現,測試方法執行之后,打印輸出了Person對象person。

可見,在設置年齡的時候就地處理,不會影響后續代碼的執行,就地處理后,我們捕獲到異常,怎么處理異常取決于我們對異常的動作,我們可以選擇將捕獲到的異常進行打印亦或是將異常轉交到其他處理異常的業務中去處理,這樣的做了就地處理不會影響我們后續的代碼執行。

好了,以上就是今天對Java異常的介紹與使用以及教學,下一篇我們就來研究一下Java中的異常的底層是怎么實現的,Exception在Java中是一種什么樣的存在?設計Exception與Error的目的在JVM處理字節碼文件指令集的過程中能起到什么樣的效果?

說到這里,如果你有一點基礎的話,相信肯定能看到我對作用(設計Exception與Error的目的在JVM處理字節碼文件指令集的過程中能起到的作用)的一些簡單了解,沒事,不夠清晰,我們還有第二篇博客詳解Exception與Error。

到此這篇關于詳解Java的Exception異常機制的文章就介紹到這了,更多相關Java Exception異常內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产高潮在线| 免费日韩视频| 欧美日本二区| 视频在线观看91| 亚洲2区在线| 国产精品手机在线播放| 激情不卡一区二区三区视频在线| 国产传媒在线| 尹人成人综合网| 日本一区二区三区视频在线看 | 久久精品国产福利| 老牛影视精品| 狠狠爱www人成狠狠爱综合网| 三级亚洲高清视频| 国产美女久久| 少妇精品导航| 亚洲精品小说| 视频一区中文字幕精品| 国产精品网在线观看| 激情国产在线| 欧美资源在线| 欧美国产视频| 亚洲午夜黄色| 国产亚洲一卡2卡3卡4卡新区| 国产一区2区在线观看| 狠狠久久婷婷| 久久精品国产成人一区二区三区| 亚洲国产专区校园欧美| 天海翼精品一区二区三区| 国产一区二区三区四区二区| 尹人成人综合网| 国产精品久一| 亚洲精品一区二区妖精| 国产日韩欧美一区| 亚洲特级毛片| 欧美激情一区| 免费美女久久99| 亚洲天堂资源| 日本精品国产| 久久久久免费av| 日韩精品视频在线看| 日韩av在线播放网址| 丝袜美腿亚洲色图| 精品亚洲成人| 日本免费一区二区视频| 久久国产影院| 国产日韩欧美在线播放不卡| 欧美成人亚洲| 久久av网站| 午夜久久av | 日韩专区精品| 日韩av一区二区三区| 桃色一区二区| 久久狠狠久久| 久久不射网站| 三级小说欧洲区亚洲区| 国产精品一区二区三区www| 国产中文一区| 精品国产美女a久久9999| 亚洲精品国产日韩| 久久国产亚洲精品| 四季av一区二区凹凸精品| 91亚洲无吗| 中文在线日韩| 欧美亚洲国产激情| 国产aⅴ精品一区二区三区久久| 日韩久久一区| 老鸭窝毛片一区二区三区| 久久精品官网| 成人欧美一区二区三区的电影| 国产精品网站在线看| 欧美一区免费| 亚洲精品影院在线观看| 午夜精品亚洲| 好看不卡的中文字幕| 999精品色在线播放| 中文在线中文资源| 国产一区调教| 精品国产精品国产偷麻豆| 国产精品综合色区在线观看| 日本色综合中文字幕| 日韩精品免费一区二区夜夜嗨| 日韩在线卡一卡二| 国产亚洲综合精品| 黄色亚洲大片免费在线观看| 久久理论电影| 久久精品国产www456c0m| 国产成人免费| 福利一区和二区| 四虎国产精品免费观看| 欧美日韩在线观看首页| 偷拍精品精品一区二区三区| 久久久人人人| 美女毛片一区二区三区四区| 国产综合色产| 国产亚洲毛片在线| 亚洲精品三级| 久久狠狠久久| 国产成人1区| 九九精品调教| 婷婷亚洲五月| 喷白浆一区二区| 视频一区二区中文字幕| 亚洲一级淫片| 综合精品一区| 免费一级片91| 男女男精品网站| 午夜亚洲福利| 久久99青青| 精品一区二区男人吃奶| 亚洲免费福利| 欧美福利一区| 综合国产在线| 久久一区亚洲| 久久精品亚洲人成影院| 日韩视频一区| 视频一区日韩| 欧美日韩亚洲一区二区三区在线| 国产精品一页| 蜜臀久久精品| 亚洲一区二区毛片| 国产欧美欧美| 久久国产毛片| 国产成人精品一区二区三区在线| 成人精品中文字幕| 免费精品视频在线| 欧美成人aaa| 久久久久久黄| 日韩 欧美一区二区三区| 精品国内亚洲2022精品成人| 国产99久久| 日本午夜免费一区二区| 麻豆成人综合网| 亚洲国产专区校园欧美| 日韩精品欧美大片| 欧美男人天堂| 日韩精品久久久久久| av中文字幕在线观看第一页| 久久午夜视频| 电影91久久久| 亚洲乱码视频| 精品三级在线观看视频| 免费日韩精品中文字幕视频在线| 久久av免费看| 亚洲免费网址| 精品久久久久中文字幕小说| 久久最新视频| 久久av综合| 午夜在线一区| 国产精品久久久久久久久妇女| 国产一区成人| 91亚洲自偷观看高清| 最新国产精品久久久| 日韩伦理一区| 18国产精品| 黄色亚洲在线| 91综合网人人| 国产精品久久久久久久久久妞妞| 国产高清久久| 成人综合一区| 91成人在线| aa亚洲婷婷| 色婷婷综合网| 97久久精品| 国产偷自视频区视频一区二区| 精品香蕉视频| 日韩不卡在线观看日韩不卡视频| 1024精品一区二区三区| 国产精品99一区二区三区| 日韩精选在线| 好吊日精品视频| 免费污视频在线一区| 国产精品**亚洲精品| 亚洲影院天堂中文av色| 色爱av综合网| 日韩成人精品一区二区| 国产精品亚洲欧美日韩一区在线| 91精品1区| 91青青国产在线观看精品| 国产精品久久久久久久免费软件 | 久久婷婷亚洲| 国产aⅴ精品一区二区三区久久| 日本视频在线一区| 亚洲一级大片| 国产精品腿扒开做爽爽爽挤奶网站| 桃色av一区二区| 精品国产亚洲一区二区在线观看| 欧美亚洲人成在线| 综合激情一区| 亚洲色图网站| 噜噜噜躁狠狠躁狠狠精品视频| 欧美片第1页| 日韩电影免费在线观看| 国产一区二区三区久久| 欧美激情精品| 久久精品二区亚洲w码| 国产精品宾馆| 国产精品白丝一区二区三区| 国产欧美亚洲一区| 国产美女视频一区二区|