JAVA进阶开发之(异常类)
保姆級別的異常類教學(附代碼)
目錄
1、什么是異常:
2、 java語言中異常以什么形式存在的呢?
3、異常對應的現(xiàn)實生活中是怎樣的?
4、異常處理機制
5、異常處理的具體方式
6、運行時異常編寫程序時可以不處理
7、方法聲明位置上使用throws
8、異常處理的原理
9、異常捕捉和上報的聯(lián)合使用
10、try......catch深入
11、上報和捕捉怎么選擇
12、異常對象的常用方法
13、finally子句的使用
14、try--catch--finally的搭配使用
15、try--finally的搭配使用
16、finally
17、finally的面試題
18、final、finally、finalize 有什么區(qū)別?
19、JAVA中自定義異常類
20、異常在實際開發(fā)中的作用
?
1、什么是異常:
當程序運行時發(fā)生的不正常的情況,JAVA會通過JVM給控制臺打印一段異常信息給程序員
程序員看到異常信息后,可以對程序進行修改,讓程序更加健壯
代碼演示:
package com.lbj.javase.exceptionTest;public class ExceptionTest02 {public static void main(String[] args) {int a=10;int b=0;//實際上JVM在執(zhí)行到此處的時候,會new異常對象并且拋出異常,打印輸出信息到控制臺//Exception in thread "main" java.lang.ArithmeticException: / by zero// at com.lbj.javase.exceptionTest.ExceptionTest02.main(ExceptionTest02.java:14)int c=10/0;System.out.println(c);} }?
?
2、 java語言中異常以什么形式存在的呢?
?異常在java中以類的形式存在,每一個異常類都可以創(chuàng)建異常對象
代碼演示:
package com.lbj.javase.exceptionTest;public class ExceptionTest01 {public static void main(String[] args) {NumberFormatException nfe=new NumberFormatException("數(shù)字格式化異常");System.out.println(nfe);//java.lang.NumberFormatException: 數(shù)字格式化異常 } }?
?
3、異常對應的現(xiàn)實生活中是怎樣的?
舉個栗子:
錢包丟了(異常類):
小明錢包丟了(異常對象)
小紅錢包丟了(異常對象)
小剛錢包丟了(異常對象)
結(jié)論:
類:模板
對象:具體實際存在的個體
?
4、異常處理機制
Object
Object下有Throwable(可拋出的)
Throwable 下有兩個分支:Error(不可處理,直接退出JVM)和Exception(可處理的)
Exception下有兩個分支:
Exception的直接子類:編譯時異常(要求程序員在編寫程序階段必須預先對異常進行處理,否則編譯不通過)
RuntimeException:運行時異常(程序員可以進行處理,也可以不處理讓程序照常編譯通過即可)
注意:強調(diào)!!!所有異常都是發(fā)生在運行階段的
?
用UML圖描述繼承結(jié)構(gòu)
UML:統(tǒng)一建模語言,一種圖標式語言(畫圖的)
使用人員:軟件架構(gòu)師、系統(tǒng)分析師、軟件設計人員(java開發(fā)人員必須要看懂)
作用:描述類和類之間的關(guān)系、程序執(zhí)行的流程、對象的狀態(tài)等
?
UML關(guān)于異常類的部分結(jié)構(gòu)圖:
?
?
5、異常處理的具體方式
第一種:在方法聲明的位置上,使用throw關(guān)鍵字,拋給上一級(誰調(diào)用我,我就拋給誰,拋給上一級)
第二種:使用try...catch語句進行異常的捕捉(這段代碼有問題,天知地知你不知我知,因為我捕捉到了)
舉個栗子:我是某某集團的一位員工,由于我的失誤,導致公司虧損1000元,
“損失的1000元” 可以看做是一個異常發(fā)生了,我有兩種處理方式
第一種:上報給公司領導,讓領導處理
第二種:自己補上這1000元,自己處理
?
思考:
異常發(fā)生后
如果我選擇上拋,拋給調(diào)用者,調(diào)用者需要對這個異常進行處理,那么這個調(diào)用者能力足夠的話就自己處理,沒有能力的話就繼續(xù)往上拋
如果最后一級實在沒辦法處理,將終止java程序的執(zhí)行
員工--》經(jīng)理--》總經(jīng)理--》老板
?
注意:java中異常發(fā)生之后如果一直上拋,最終拋給了main方法,main方法繼續(xù)向上拋,拋給了調(diào)用者JVM,JVM如果知道這個異常發(fā)生,只有一個結(jié)果,將終止java程序的執(zhí)行
?
?
6、運行時異常編寫程序時可以不處理
運行時,意味著程序的異常可以不進行處理,也能編譯通過
代碼演示:
package com.lbj.javase.exceptionTest;public class ExceptionTest03 {public static void main(String[] args) {/*程序執(zhí)行到此處發(fā)生了Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.lbj.javase.exceptionTest.ExceptionTest03.main(ExceptionTest03.java:12)異常底層new了一個ArithmeticException異常對象然后拋出給main方法,main方法沒有處理,將這個異常自動拋給了JVMJVM終止程序執(zhí)行*/System.out.println(100/0);//這里hello沒有執(zhí)行System.out.println("hello");} }?
?
?
7、方法聲明位置上使用throws
編譯時異常,必須進行處理,否則編譯器報錯
代碼演示:
package com.lbj.javase.exceptionTest;public class ExceptionTest04 {public static void main(String[] args) {//main方法調(diào)用doSome方法//我們在調(diào)用doSome方法的時候必須對這種異常進行預先的處理//如果不處理,編譯器報錯doSome();//報錯信息//java: 未報告的異常錯誤java.lang.ClassNotFoundException; 必須對其進行捕獲或聲明以便拋出}/*doSome方法在方法聲明的位置上使用了throws ClassNotFoundException這個代碼表示doSome()方法在執(zhí)行過程中,有可能會出現(xiàn)異常叫做“類沒有找到的異常”直接父類是:Exception所以ClassNotFoundException屬于編譯時異常*/public static void doSome() throws ClassNotFoundException{System.out.println("doSome()!!!");} }?
?
8、異常處理的原理
第一種處理方式:在方法聲明位置繼續(xù)往上拋(下面這段代碼的main方法將異常上拋給了JVM)
上拋類似于推卸責任,繼續(xù)把異常傳遞給下一個調(diào)用者
package com.lbj.javase.exceptionTest;public class ExceptionTest05 {public static void main(String[] args) throws ClassNotFoundException {doSome();}public static void doSome() throws ClassNotFoundException{System.out.println("doSome()!!!");} }?
第二種處理方式:try...catch進行捕捉
捕捉相當于把異常攔截下,異常真正解決了,調(diào)用者并不會知道自己調(diào)用的東西有異常
package com.lbj.javase.exceptionTest;public class ExceptionTest05 {public static void main(String[] args) {try {doSome();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static void doSome() throws ClassNotFoundException{System.out.println("doSome()!!!");} }?
?
9、異常捕捉和上報的聯(lián)合使用
先搭建一個方法調(diào)用的基礎結(jié)構(gòu)
package com.lbj.javase.exceptionTest;/*** 處理異常的第一種方式:在方法聲明的位置上使用throws關(guān)鍵字拋出* 誰調(diào)用我這個方法,我就拋給誰,上拋給調(diào)用者來處理*/ public class ExceptionTest06 {public static void main(String[] args) {m1();}private static void m1() {m2();}private static void m2() {m3();}private static void m3() {} }?
當我們進行異常調(diào)用上拋的時候
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;/*** 處理異常的第一種方式:在方法聲明的位置上使用throws關(guān)鍵字拋出* 誰調(diào)用我這個方法,我就拋給誰,上拋給調(diào)用者來處理*/ public class ExceptionTest06 {public static void main(String[] args) throws Exception {System.out.println("main begin");m1();System.out.println("main end");}private static void m1() throws FileNotFoundException, ClassCastException {System.out.println("m1 begin");m2();System.out.println("m1 end");}private static void m2() throws FileNotFoundException {System.out.println("m2 begin");//編譯器一開始報錯的原因是m3() 方法聲明位置上有throws FileNotFoundException//我們在這里調(diào)用m3() 的時候沒有對異常進行預處理,所以編譯報錯m3();System.out.println("m2 end");}private static void m3() throws FileNotFoundException {//通過類的繼承結(jié)構(gòu)看到FileNotFoundException父類是IOException//IOException的父類是Exception//因此得知是編譯時異常new FileInputStream("D:\\2021-2022課件\\123.txt");} }?
注意:
一般不建議在main方法上使用throws,因為這個異常如果真正發(fā)生了,一定會拋給JVM,JVM只有終止。
因此,一般main方法中的異常建議使用try...catch進行捕捉,main就不會繼續(xù)上拋
?
當以上程序:
?new FileInputStream("D:\\2021-2022課件\\123.txt");
是正確的時候,運行結(jié)果如下:
?
當文件IO流不正確的時候,會產(chǎn)生異常信息
new FileInputStream("D:\\2021-2022課件");
以下結(jié)果得知:一個方法體中的代碼出現(xiàn)異常之后,如果上報的話,此方法結(jié)束
?
?
我們對代碼進行修改,將異常信息在main方法中進行捕捉后:
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;/*** 處理異常的第一種方式:在方法聲明的位置上使用throws關(guān)鍵字拋出* 誰調(diào)用我這個方法,我就拋給誰,上拋給調(diào)用者來處理*/ public class ExceptionTest06 {public static void main(String[] args){System.out.println("main begin");try {m1();//e 是new FileNotFoundException的對象的內(nèi)存地址} catch (FileNotFoundException e) {System.out.println("文件不存在,可能路徑錯誤,也可能是文件刪除了,文件不屬于IO流文件");}System.out.println("main end");}private static void m1() throws FileNotFoundException, ClassCastException {System.out.println("m1 begin");m2();System.out.println("m1 end");}private static void m2() throws FileNotFoundException {System.out.println("m2 begin");//編譯器一開始報錯的原因是m3() 方法聲明位置上有throws FileNotFoundException//我們在這里調(diào)用m3() 的時候沒有對異常進行預處理,所以編譯報錯m3();System.out.println("m2 end");}private static void m3() throws FileNotFoundException {//通過類的繼承結(jié)構(gòu)看到FileNotFoundException父類是IOException//IOException的父類是Exception//因此得知是編譯時異常new FileInputStream("D:\\2021-2022課件");} }?
代碼分析:
由于路徑是錯誤的,路徑內(nèi)容并不屬于IO流文件
new FileInputStream("D:\\2021-2022課件");
但是此時異常已經(jīng)被main方法捕捉到,在控制臺上打印一段異常的信息,這段信息程序員就可以知道自己的程序有問題,需要修改
運行結(jié)果如下:
?
?
規(guī)律:
捕捉到的異常代碼段會完全執(zhí)行(如main中的begin和end)
只要異常沒有被捕捉,采用上報的方式,此方法的后續(xù)代碼不會執(zhí)行
另外要注意:try語句塊中的某一行出現(xiàn)異常,該行后面的代碼不會執(zhí)行
?
?
10、try......catch深入
catch后面的小括號中的類型可以是具體的異常類型,也可以是該異常類型的父類型
catch可以寫多個,建議catch的時候,一個一個精確處理,方便程序員調(diào)試
catch寫多個的時候,一定要初一,從上到下,!!!必須遵守從小到大,不能先父類異常再子類異常
JDK8新特性,可以用 | 符號分隔異常catch(FileNotFoundException | NullPointerException e)
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;public class ExceptionTest07 {public static void main(String[] args) { // try { // FileInputStream fis = new FileInputStream("D:\\2021-2022課件"); // } catch (FileNotFoundException e) { // e.printStackTrace(); // }// try { // FileInputStream fis = new FileInputStream("D:\\2021-2022課件"); // } catch (Exception e) {//用了多態(tài) 父類引用指向子類對象 // System.out.println("文件不存在"); // }try {FileInputStream fis = new FileInputStream("D:\\2021-2022課件");fis.read();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e){System.out.println("讀寫異常");}} }?
?
?
11、上報和捕捉怎么選擇
如果希望調(diào)用者來處理,選擇throws上報
其余情況,皆用try......catch
?
?
12、異常對象的常用方法
第一個:獲取異常簡單的描述信息 String msg = exception.getMassage();
第二個:打印異常追蹤的堆棧信息? exception.printStackTrace();
代碼演示:
package com.lbj.javase.exceptionTest;public class ExceptionTest08 {public static void main(String[] args) {//這里只是為了測試getMassage()方法和printStackTrace()方法//這里只new了異常對象,但是沒有將異常對象拋出。JVM會認為這是一個普通的java對象NullPointerException exception=new NullPointerException("空指針異常");//獲取異常簡單描述信息,這個信息實際上就是構(gòu)造方法上面String參數(shù)String s=exception.getMessage();System.out.println(s);//打印異常堆棧信息,并不代表此時程序正在發(fā)生異常//java后臺打印異常堆棧追蹤信息的時候,采用了異步線程的方式打印exception.printStackTrace();System.out.println("hello");} }結(jié)果演示:
這里飄紅的信息并不是異常報錯,只是將異常信息進行輸出
?
代碼演示:
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException;public class ExceptionTest09 {public static void main(String[] args) {try {m1();} catch (FileNotFoundException e) {//在日常開發(fā)中,建議使用打印異常堆棧追蹤信息,養(yǎng)成好習慣e.printStackTrace();}//如果這里是一段正常的代碼,那么上一段代碼不會影響到下面的代碼,這就是try--catch的好處System.out.println("上面出異常,下面依舊正常");}private static void m1() throws FileNotFoundException {m2();}private static void m2() throws FileNotFoundException {m3();}private static void m3() throws FileNotFoundException {new FileInputStream("D:\\2021-2022課件");} }結(jié)果演示:
?
?
查看上圖的異常信息的時候,我們應該怎么看才能快速調(diào)試程序呢?
答案:
異常信息追蹤信息,從上往下一行一行看
但是要注意的是,SUN寫的代碼就不用看了(看包名就知道是自己的還是SUN的)
主要問題還是出現(xiàn)在自己編寫的代碼上
?
代碼演示(獲取異常的簡單描述信息):
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException;public class ExceptionTest10 {public static void main(String[] args) {try {m1();} catch (FileNotFoundException e) {//獲取異常的簡單描述信息String msg=e.getMessage();System.out.println(msg);}//如果這里是一段正常的代碼,那么上一段代碼不會影響到下面的代碼,這就是try--catch的好處System.out.println("上面出異常,下面依舊正常");}private static void m1() throws FileNotFoundException {m2();}private static void m2() throws FileNotFoundException {m3();}private static void m3() throws FileNotFoundException {new FileInputStream("D:\\2021-2022課件");} }結(jié)果演示:
?
?
?
13、finally子句的使用
代碼演示(請問:這樣的異常會發(fā)生什么情況):
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;public class ExceptionTest11 {public static void main(String[] args) {try {//創(chuàng)建輸入流對象FileInputStream fis=new FileInputStream("D:\\2021-2022課件\\123.txt");//這里一定會出現(xiàn)空指針異常String s=null;s.toString();//流使用結(jié)束后要關(guān)閉,因為流式占用資源的fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e){e.printStackTrace();}} }結(jié)果演示(結(jié)果:String s=null;出了異常,下面的一句代碼fis.close();就不會執(zhí)行,流就不會關(guān)閉):
?
?
14、try--catch--finally的搭配使用
代碼演示(finally中的代碼是一定會執(zhí)行的):
package com.lbj.javase.exceptionTest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.exceptionTest* @date 2021/3/23 20:49* @Copyright 公司*/ public class ExceptionTest11 {public static void main(String[] args) {FileInputStream fis = null;try {//創(chuàng)建輸入流對象fis=new FileInputStream("D:\\2021-2022課件\\123.txt");//這里一定會出現(xiàn)空指針異常String s=null;s.toString();//流使用結(jié)束后要關(guān)閉,因為流式占用資源的//以上程序出現(xiàn)異常,流也必須關(guān)閉,放在此處可能流關(guān)閉不了//fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e){e.printStackTrace();} catch(NullPointerException e){e.printStackTrace();} finally {//流的關(guān)閉在這里比較保險//finally中的代碼是一定會執(zhí)行的//即使try中出現(xiàn)異常if(fis!=null){ //此判斷是為了避免空指針異常而關(guān)閉流try {//close()方法有異常,采用捕捉的方式fis.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println("這段話會不會執(zhí)行呢");}}演示結(jié)果:
?
?
15、try--finally的搭配使用
代碼演示(再次強調(diào),放在finally語句塊中的代碼是一定會執(zhí)行的,除非退出JVM):
package com.lbj.javase.exceptionTest;public class ExceptionTest12 {public static void main(String[] args) {try {System.out.println("123");return;} finally {//finally中的語句能執(zhí)行到System.out.println("abc");}//return一旦執(zhí)行,整個方法體結(jié)束,卸載return后面的語句也不會執(zhí)行//System.out.println("faffaf");} }結(jié)果演示:
123
abc
?
16、finally
代碼演示(退出JVM之后finally語句中的代碼就不執(zhí)行了):
package com.lbj.javase.exceptionTest;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.exceptionTest* @date 2021/3/23 21:28* @Copyright 公司*/ public class ExceptionTest13 {public static void main(String[] args) {try{System.out.println("try...");//退出JVMSystem.exit(0);} finally {System.out.println("finally");}}}結(jié)果演示:
try...
?
?
?
17、finally的面試題
java語法規(guī)則,有一些規(guī)則是不能被破壞的?
方法體中的代碼,必須自上而下的順序逐行執(zhí)行
return語句還必須保證是最后執(zhí)行的,一旦執(zhí)行,方法體結(jié)束
面試題目(請分析輸出結(jié)果):
先執(zhí)行了finally中的代碼,然后再執(zhí)行return,不沖突
package com.lbj.javase.exceptionTest;public class ExceptionTest14 {public static void main(String[] args) {int m=m();System.out.println(m);}public static int m(){int i=100;try{//return語句還必須保證是最后執(zhí)行的,一旦執(zhí)行,方法體結(jié)束return i;}finally {i++;}} }輸出結(jié)果:
100
反編譯后的效果(需要用反編譯工具):
j:其實是臨時變量
public static int m(){
? ? ? ?int i =100;
? ? ? ?int j =i;
? ? ? ?i++;
? ? ? ?return j;
}
?
?
18、final、finally、finalize 有什么區(qū)別?
package com.lbj.javase.exceptionTest;public class ExceptionTest15 {public static void main(String[] args) {//final是關(guān)鍵字,賦值后不能再次賦值final int a=1;//a=2;//finally是異常機制中的和try要一起使用//finalize()是Object類中的一個方法,作為方法名出線//是JVM的垃圾回收器負責調(diào)用} }?
19、JAVA中自定義異常類
SUN公司提供的JDK內(nèi)置異常類肯定是不夠用的,在實際開發(fā)中,有很多業(yè)務
這些業(yè)務出現(xiàn)異常后,JDK都是沒有的,我們通過查看源代碼得知,異常類其實是有規(guī)律的
?
得出規(guī)律:
第一步:編寫一個類繼承Exception或者RuntimeException
第二步:提供兩個構(gòu)造方法,一個是無參數(shù)的,一個是有參數(shù)的?
代碼演示:
自定義異常類
package com.lbj.javase.exceptionTest;public class MyException01 extends Exception{public MyException01() {}public MyException01(String message) {super(message);} }調(diào)用自定義異常類
package com.lbj.javase.exceptionTest;public class ExceptionTest16 {public static void main(String[] args) {//創(chuàng)建異常對象(只是new了異常對象,并沒有手動拋出)MyException01 e=new MyException01("用戶名不能為空");//打印異常堆棧信息e.printStackTrace();//獲取異常簡單描述信息String msg= e.getMessage();System.out.println(msg);}}控制臺打印信息:
?
?
20、異常在實際開發(fā)中的作用
(自定義的異常類,可以在對應的類中直接new出來,然后再進行throw手動拋出,再在調(diào)用此異常類的方法時,手動try--catch處理,就可以達到用異常信息流打印到控制臺,并且終止程序執(zhí)行,可以替代return這種單純結(jié)束方法體的行為)
代碼演示:
步驟一:自定義異常類
package com.lbj.javase.array;public class MyStackOperationException extends Exception{public MyStackOperationException() {}public MyStackOperationException(String message) {super(message);} }步驟二:實例化異常類
package com.lbj.javase.array;/** 練習編寫程序,使用一維數(shù)組,模擬棧數(shù)據(jù)結(jié)構(gòu)要求:1、這個棧可以存儲java中任何引用類型的數(shù)據(jù)2、在棧中提供push方法模擬壓棧(棧滿了,要有提示信息)3、在棧中提供pop方法模擬彈棧(棧空了,也要有提示信息)4、編寫測試程序,new棧對象,調(diào)用push pop 方法來模擬彈棧壓棧的動作5、假設棧的默認初始化容量是10(請注意無參構(gòu)造方法的編寫方式)*/ public class ArrayTest10 {private Object[] elements;//需要有一個棧幀,這個棧幀,永遠指向棧頂部元素[0]//注意:最初的棧是空的,一個元素也沒有//那么這個默認的初始值是多少?//如果index采用0,表示棧幀指向頂部元素的上方。相當于空的指向//如果index采用-1,表示棧幀指向頂部元素private int index;public ArrayTest10(){//假設棧的默認容量是10,那么一維數(shù)組動態(tài)初始化的固定長度就等于10//因為實例變量初始化的時候是構(gòu)造方法在執(zhí)行的時候,所以構(gòu)造方法中初始化和外邊初始化效果是一樣的this.elements=new Object[10];//給index賦值this.index=-1;}//壓棧方法//obj是被壓入的元素public void push(Object obj) throws MyStackOperationException {if(this.index>=this.elements.length-1){ // System.out.println("壓棧失敗,棧滿"); // //如果return語句執(zhí)行,整個方法就應該結(jié)束 // return;//改良//創(chuàng)建異常對象MyStackOperationException e=new MyStackOperationException("壓棧失敗,棧滿");//手動將異常拋出去throw e;}//承接上面的return語句,如果程序能走到這里,說明棧沒滿this.index++;this.elements[index]=obj;//obj其實是obj.toString 說了很多次 在System.out.println中會自動調(diào)用toString方法System.out.println("壓棧"+obj+"成功,棧幀指向"+index);}//彈棧的方法,從數(shù)組中往外面取元素,每取一個,棧幀減一public Object pop() throws MyStackOperationException {if(this.index<0){ // System.out.println("棧空,彈棧失敗"); // return null;//改良throw new MyStackOperationException("棧空,彈棧失敗");}//程序執(zhí)行到此處說明棧沒有空System.out.println("彈棧"+elements[index]+"成功,棧幀指向"+index);//棧幀向下移動一位this.index--;return null;}//set和get也許使用不上,但是你必須寫上,這是規(guī)矩//封裝:第一步 屬性私有化 第二步 對外提供get和set方法public Object[] getElements() {return elements;}public void setElements(Object[] elements) {this.elements = elements;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;} }步驟三:最終調(diào)用類的引用對異常進行try--catch處理
package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/21 16:41* @Copyright 公司*/ public class MyStackTest01 {public static void main(String[] args) {//new 是把構(gòu)造方法實例化//也就是意味著 創(chuàng)建一個棧對象,初始化容量是10個ArrayTest10 arrayTest10=new ArrayTest10();//調(diào)用方法壓棧try {arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());arrayTest10.push(new Object());//最后壓入的,最先彈出來//壓到這個元素的時候失敗了arrayTest10.push(new Object());} catch (MyStackOperationException e) {//輸出簡單的異常信息System.out.println(e.getMessage());}//調(diào)用方法彈棧//彈棧顧名思義我們需要獲取些什么//Object ele=arrayTest10.pop();try {arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();arrayTest10.pop();//彈出的時候,此時棧空了arrayTest10.pop();} catch (MyStackOperationException e) {//輸出簡單的異常信息System.out.println(e.getMessage());}} }運行結(jié)果:
?
編程習慣:
當if判斷為程序執(zhí)行到此就是“錯誤”的時候,不要用return來結(jié)束程序,我們要用異常來結(jié)束程序
?
?
下一章節(jié),我們講異常的練習題
?
?
?
總結(jié)
以上是生活随笔為你收集整理的JAVA进阶开发之(异常类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yoga710怎么进入bios_【解读Y
- 下一篇: 戴尔便携式计算机无法开机,戴尔笔记本电脑