制作購物網(wǎng)站怎么做seo網(wǎng)站關(guān)鍵詞優(yōu)化
目錄
1.異常的概念與體系結(jié)構(gòu)
?1.1異常的體系結(jié)構(gòu)
1.2異常的舉例
1.3錯誤的舉例
?2.異常的分類
2.1編譯時異常
?2.2運行時異常
3.異常的處理
3.1異常的拋出throw
3.2try-catch捕獲并處理
3.3finally
3.4?異常聲明throws
4.自定義異常類
1.異常的概念與體系結(jié)構(gòu)
?1.1異常的體系結(jié)構(gòu)

??從上圖中可以看到:
1. Throwable : 是異常體系的頂層類,其派生出兩個重要的子類 , Error 和 Exception2. Error : 指的是 Java 虛擬機無法解決的嚴重問題,比如: JVM 的內(nèi)部錯誤、資源耗盡等 ,典型代表: StackOverflflowError 和 OutOfMemoryError ,一旦發(fā)生回力乏術(shù)。3. Exception : 異常產(chǎn)生后程序員可以通過代碼進行處理,使程序繼續(xù)執(zhí)行。比如:感冒、發(fā)燒。我們平時所說 的異常就是Exception 。?
1.2異常的舉例
public static void main(String[] args) {System.out.println(10/0);}
運行結(jié)果及分析:
補充:
?
?(2)數(shù)組越界異常
public static void main(String[] args) {int[] arr = {1, 2, 3,4,5};System.out.println(arr[10]);}
public static void main(String[] args) {int[] arr = null;System.out.println(arr.length);}
1.3錯誤的舉例
StackOverflflowError
public class Text2 {public static void fun(){fun();}public static void main(String[] args) {fun();}
}
執(zhí)行結(jié)果:
?2.異常的分類
2.1編譯時異常

理解:?

正確完整代碼:
public class Text3 {public static void main(String[] args) throws CloneNotSupportedException {Person p1 = new Person(18, "WH");Person p2= (Person) p1.clone();}
}
public class Person {int age;String nume;public Person(int age, String nume) {this.age = age;this.nume = nume;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
?2.2運行時異常
?
3.異常的處理
在Java中,異常處理主要的5個關(guān)鍵字:try、catch、final、throw、throws。

3.1異常的拋出throw
throw new XXXException ( " 異常產(chǎn)生的原因 " )

運行結(jié)果:
Exception in thread "main" java.lang.NullPointerException: hahaha
(1) throw 必須寫在方法體內(nèi)部(2)拋出的對象必須是 Exception 或者 Exception 的子類對象(3) 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處? ? ? ? ? ? ? ? ?理,?直接交給JVM來處理(4)如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯(5)異常一旦拋出,其后的代碼就不會執(zhí)行
對于(3)(5)舉例:


3.2try-catch捕獲并處理
語法形式:
public static void main(String[] args) {try{System.out.println(10/0);System.out.println(100);}catch (ArithmeticException e){e.printStackTrace();}}
運行結(jié)果:
java.lang.ArithmeticException: / by zero
(2)如果拋出異常類型與catch時異常類型不匹配,即異常不會被成功捕獲,也就不會被處理,繼續(xù)往外拋,直到 JVM收到后中斷程序----異常是按照類型來捕獲的
public static void main(String[] args) {try {System.out.println(10/0);} catch (NullPointerException e) {System.out.println(10);}}
運行結(jié)果:
Exception in thread "main" java.lang.ArithmeticException: / by zero

?
(4)如果異常之間具有父子關(guān)系,一定是子類異常在前catch,父類異常在后catch,否則語法錯誤
(5)可以通過一個catch捕獲所有的異常,即多個異常,一次捕獲(不推薦)
3.3finally

finally 執(zhí)行的時機是在方法返回之前 (try 或者 catch 中如果有 return 會在這個 return 之前執(zhí)行 fifinally). 但是如果 finally 中也存在 return 語句 , 那么就會執(zhí)行 fifinally 中的 return, 從而不會執(zhí)行到 try 中原有的 return.一般我們不建議在 finally 中寫 return ( 被編譯器當做一個警告 )
?
3.4?異常聲明throws
?
語法格式:
修飾符 返回值類型 方法名 ( 參數(shù)列表 ) throws 異常類型 1 ,異常類型 2 ...{}??注意:
如果方法是main方法調(diào)用者仍然可以不處理異常,借助throws將異常拋 給JVM來處理。
1. throws 必須跟在方法的參數(shù)列表之后2. 聲明的異常必須是 Exception 或者 Exception 的子類3. 方法內(nèi)部如果拋出了多個異常, throws 之后必須跟多個異常類型,之間用逗號隔開,如果拋出多個異常類型 具有父子關(guān)系,直接聲明父類即可。4.我們在使用throws時,要明確聲明的異常是編譯時異常還是運行時異常。
比如:
(1)
(2)?
?
如果是?運行時異常調(diào)用者不處理異常也沒關(guān)系,JVM會處理。
但如果是編譯時異常一定要處理異常
處理方式:(1)try-catch捕獲并處理
? ? ? ? ? ? ? ? ? (2)借助throws將異常拋 給JVM來處理。
4.自定義異常類

定義Course類,Course包含private String cno,private String cname,private int credit,Course包括方法:public Course(),public Course。Define CreditException類擴展(繼承)?在RunTimeException中,CreditException包含以下方法:public CreditException()、public CreditException(String Message)。
如果課程的學分低于0.5或高于6,則課程的構(gòu)建方法將拋出CreditException,消息為“學分應(yīng)在0.5和6之間!”。
定義公共類TestCourse,創(chuàng)建一個Course對象,并使用try/catch塊來處理CreditException。
import java.util.Scanner;public class LogIn {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("請輸入cno");String cno=scanner.next();System.out.println("請輸入課程名字");String cname=scanner.next();System.out.println("請輸入學分");double credit=scanner.nextDouble();Course course=new Course(cno,cname,credit);try {if(!(course.getCredit()>=0.5&&course.getCredit()<=6)){throw new CreditException("課程的學分應(yīng)在0.5到6之間");}else{System.out.println("輸入成功學分為:"+course.getCredit());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
class Course{private String cno;private String cname;private double credit;public Course(String cno, String cname, double credit) {this.cno = cno;this.cname = cname;this.credit = credit;}public Course() {}public String getCno() {return cno;}public void setCno(String cno) {this.cno = cno;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public double getCredit() {return credit;}public void setCredit(double credit) {this.credit = credit;}}
class CreditException extends RuntimeException{public CreditException(String message){super(message);}
}
注意事項
- 自定義異常通常會繼承自 Exception 或者 RuntimeException
- 繼承自 Exception 的異常默認是受查異常
- 繼承自 RuntimeException 的異常默認是非受查異常
以上為我個人的小分享,如有問題,歡迎討論!!!?
都看到這了,不如關(guān)注一下,給個免費的贊?
?