您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java異常處理機(jī)制實(shí)例分析”,在日常操作中,相信很多人在Java異常處理機(jī)制實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java異常處理機(jī)制實(shí)例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
拋出異常,在執(zhí)行一個(gè)方法時(shí),如果發(fā)送了異常,則這個(gè)方法生成代表該異常的一個(gè)對象,停止當(dāng)前執(zhí)行的 路徑,并把異常提交給jre。
捕獲異常:jre得到該異常后,虛招相應(yīng)的代碼來處理該異常。jre在方法的調(diào)用棧中查找,從生成異常的 方法開始回溯,直到找到相應(yīng)的異常處理代碼為止。
歐克,我們現(xiàn)在知道異常的定義是什么,那我們就應(yīng)該如何去捕捉異常,然后去處理異常。
首先我們先看一段代碼:
package AbnormalTest; import java.util.InputMismatchException; import java.util.Scanner; public class test1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); try { System.out.print("請輸入被除數(shù):"); int a = input.nextInt(); System.out.print("請輸入除數(shù):"); int b = input.nextInt(); int sum = b/a; System.out.println("結(jié)果是:"+sum); System.out.println("程序無異常,執(zhí)行完畢!"); }catch (Exception e){ //通用異常 //printStackTrace()方法是將堆棧異常的錯(cuò)誤信息打印出來(后期學(xué)習(xí)框架后我們一般提交或 者回滾事務(wù)) e.printStackTrace(); System.out.println("程序異常,請重試!"); return ; }finally { //不管是否發(fā)生了異常,都會(huì)執(zhí)行finally內(nèi)的代碼,通常用于資源的關(guān)閉 System.out.println("------------------------------"); System.out.println("程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用"); input.close(); //關(guān)閉Scanner對象,節(jié)省資源 } } }
代碼解釋:
上述代碼中有try-catch-finally結(jié)構(gòu),他們分別的作用是什么?
try:我們把可能出現(xiàn)異常的代碼用try去包括起來
catch :只要try代碼塊里面的代碼運(yùn)行時(shí)發(fā)生了異常,就會(huì)進(jìn)入catch來捕捉異常
finally:不管之前代碼怎么執(zhí)行,都會(huì)執(zhí)行finally的代碼塊?。?/p>
運(yùn)行結(jié)果示例:
正常時(shí):
異常時(shí):
當(dāng)被除數(shù)為0時(shí),將會(huì)觸發(fā)異常,進(jìn)入catah內(nèi)進(jìn)行捕捉,但是不管有沒有異常,都會(huì)執(zhí)行finally內(nèi)的程序輸出:程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用
我們知道,在一段代碼中可能不止一個(gè)異常,比如上述代碼,可能存在被除數(shù)為0的異常,也可能輸入字符進(jìn)行計(jì)算的輸入異常,或者可能存在數(shù)字格式化異常等等,這樣我們就可以使用多catch來捕捉異常:
還是以上面的代碼為例:
import java.util.InputMismatchException; import java.util.Scanner; public class test1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); try { System.out.print("請輸入被除數(shù):"); int a = input.nextInt(); System.out.print("請輸入除數(shù):"); int b = input.nextInt(); int sum = b/a; System.out.println("結(jié)果是:"+sum); System.out.println("程序無異常,執(zhí)行完畢!"); }catch (InputMismatchException e){ //多重catch結(jié)構(gòu),這里捕捉輸入異常 e.printStackTrace(); System.out.println("程序輸入異常,請重試!"); }catch (Exception e){ //這里捕捉通用異常(其他異常都可以在這里進(jìn)行捕捉) e.printStackTrace(); System.out.println("程序異常,請重試!"); return ; }finally { //不管是否發(fā)生了異常,都會(huì)執(zhí)行finally內(nèi)的代碼,通常用于資源的關(guān)閉 System.out.println("------------------------------"); System.out.println("程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用"); input.close(); //關(guān)閉Scanner對象,節(jié)省資源 } } }
當(dāng)輸入不是為數(shù)字的時(shí)候:
這樣我們可以看出,在第一個(gè)catch內(nèi)就已經(jīng)捕捉到了
假設(shè)我定義了一個(gè)方法,告知該方法可能會(huì)發(fā)送某種異常(聲明異常),調(diào)用者調(diào)用該方法的時(shí)候就務(wù)必要對該異常進(jìn)行處理。
首先我們定義一個(gè)錯(cuò)誤類:
學(xué)生類:
package ExceptionText; /** * 異常測試 */ public class Student { private String name; private int age; private char sex; public void setName(String name) { this.name = name; } public String getName() { return name; } public int getAge() { return age; } public char getSex() { return sex; } public void setAge(int age) throws Exception { if (age < 101 && age > 0) { this.age = age; } else { throw new Exception("年齡輸入有誤!"); } } public void setSex(char sex) throws Exception { if (sex == '男' || sex == '女') { this.sex = sex; } else { throw new Exception("性別輸入有誤"); } } }
測試類:
package ExceptionText; public class TestMain { public static void main(String[] args) { Student stu = new Student(); stu.setName("小紅"); try { stu.setAge(50); stu.setSex('k'); System.out.println("我叫:"+stu.getName()+"年齡:"+stu.getAge()+"我的性別是:"+stu.getSex()); } catch (Exception e) { e.printStackTrace(); } } }
當(dāng)出入都正確的時(shí)候:
當(dāng)年齡輸入不正確的時(shí)候:
當(dāng)性別輸入不正確的時(shí)候:
注意:如果存在多個(gè)異常,那么會(huì)拋出第一個(gè)出現(xiàn)的異常。
當(dāng)RuntimeException的運(yùn)行時(shí)異常的子類無法滿足我們的需求的時(shí)候,我們也可以自定義運(yùn)行時(shí)異常和拋出自定義的異常信息來滿足我們的需求,但是要注意:自定義的運(yùn)行時(shí)異常要繼承RuntimeException!?。?/p>
自定義異常類:
//這個(gè)類是繼承了RuntimeException public class AgeException extends RuntimeException { //構(gòu)造方法 public AgeException(String message) { super(message); } }
學(xué)生信息類:
package CustomizeException; public class Student { private String name; private int age; private char sex; public void setName(String name) { this.name = name; } public String getName() { return name; } public int getAge() { return age; } public char getSex() { return sex; } //方法 //使用throws 來聲明異常,就是這個(gè)方法內(nèi)可能存在異常,先事先聲明 public void setAge(int age) throws Exception { if (age < 101 && age > 0) { this.age = age; } else { //如果不符合上面的if判斷 throw new Exception("年齡輸入有誤!"); //這里就要用thrwo 來拋出異常, } } public void setSex(char sex) throws Exception { if (sex == '男' || sex == '女') { this.sex = sex; } else { throw new AgeException("這是自定義異常,性別輸入有誤"); } } }
測試類:
package ExceptionText; public class TestMain { public static void main(String[] args) { Student stu = new Student(); stu.setName("小紅"); try { stu.setAge(18); stu.setSex('女'); System.out.println("我叫:"+stu.getName()+"年齡:"+stu.getAge()+"我的性別是:"+stu.getSex()); } catch (Exception e) { e.printStackTrace(); } } }
這個(gè)部分的代碼和上面第三部分的一致,可以參考上面的示例。
到此,關(guān)于“Java異常處理機(jī)制實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。