拋出異常,在執行一個方法時,如果發送了異常,則這個方法生成代表該異常的一個對象,停止當前執行的路徑,並把異常提交給jre。
捕獲異常:jre得到該異常後,虛招對應的程式碼來處理該異常。 jre在方法的呼叫堆疊中查找,從產生異常的 方法開始回溯,直到找到對應的異常處理程式碼為止。
#歐克,我們現在知道異常的定義是什麼,那我們就應該如何去捕捉異常,然後去處理異常。
#首先我們先看一段程式碼:
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("请输入被除数:"); int a = input.nextInt(); System.out.print("请输入除数:"); int b = input.nextInt(); int sum = b/a; System.out.println("结果是:"+sum); System.out.println("程序无异常,执行完毕!"); }catch (Exception e){ //通用异常 //printStackTrace()方法是将堆栈异常的错误信息打印出来(后期学习框架后我们一般提交或 者回滚事务) e.printStackTrace(); System.out.println("程序异常,请重试!"); return ; }finally { //不管是否发生了异常,都会执行finally内的代码,通常用于资源的关闭 System.out.println("------------------------------"); System.out.println("程序结束,资源已经关闭,欢迎再次使用"); input.close(); //关闭Scanner对象,节省资源 } } }
程式碼解釋:
上述程式碼中有try-catch-finally結構,他們分別的作用是什麼?
try:我們把可能出現異常的程式碼用try去包含起來
catch :只要try程式碼區塊裡面的程式碼執行時發生了異常,就會進入catch來捕捉異常
finally:不管之前程式碼怎麼執行,都會執行finally的程式碼區塊! !
執行結果範例:
正常時:
#異常時:
當被除數為0時,將會觸發異常,進入catah內進行捕捉,但不管有沒有異常,都會執行finally內的程式輸出:程式結束,資源已經關閉,歡迎再次使用
我們知道,在一段程式碼中可能不只一個異常,例如上述程式碼,可能存在被除數為0的異常,也可能輸入字元進行計算的輸入異常,或者可能存在數字格式化異常等等,這樣我們就可以使用多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("请输入被除数:"); int a = input.nextInt(); System.out.print("请输入除数:"); int b = input.nextInt(); int sum = b/a; System.out.println("结果是:"+sum); System.out.println("程序无异常,执行完毕!"); }catch (InputMismatchException e){ //多重catch结构,这里捕捉输入异常 e.printStackTrace(); System.out.println("程序输入异常,请重试!"); }catch (Exception e){ //这里捕捉通用异常(其他异常都可以在这里进行捕捉) e.printStackTrace(); System.out.println("程序异常,请重试!"); return ; }finally { //不管是否发生了异常,都会执行finally内的代码,通常用于资源的关闭 System.out.println("------------------------------"); System.out.println("程序结束,资源已经关闭,欢迎再次使用"); input.close(); //关闭Scanner对象,节省资源 } } }
當輸入不是為數字的時候:
這樣我們可以看出,在第一個catch內就已經捕捉到了
假設我定義了一個方法,告知該方法可能會發送某種異常(聲明異常),呼叫者呼叫該方法的時候就務必要對該異常進行處理。
首先我們定義一個錯誤類別:
學生類別:
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(); } } }
當出入都正確的時候:
當年齡輸入不正確的時候:
#當性別輸入不正確的時候:
#注意:如果存在多個異常,那麼會拋出第一個出現的例外。
當RuntimeException的運行時異常的子類別無法滿足我們的需求的時候,我們也可以自訂運行時異常和拋出自訂的異常資訊來滿足我們的需求,但是要注意:自訂的運行時異常要繼承RuntimeException! ! !
自訂例外類別:
//这个类是继承了RuntimeException public class AgeException extends RuntimeException { //构造方法 public AgeException(String message) { super(message); } }
學生資訊類別:
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 来声明异常,就是这个方法内可能存在异常,先事先声明 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(); } } }
這部分的程式碼和上面第三部分的一致,可以參考上面的範例。
以上是Java異常處理機制實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!