關鍵知識點及補充
- 出現異常如果不解決,程式無法繼續向下執行
- 平時我們遇到的異常看書寫格式,很明顯,都是類,java源碼中在會出現異常的地方,都會有 throw new 異常類(); 也就是建立了異常,阻斷了我們的編譯,或着運作
- 我們也可以模仿異常的來建立自己的異常來判斷阻斷,異常都是繼承自Exception|RuntimeException,編譯時|運作時異常
- 增強程式健壯性隻能解決程式的運作時異常
- throw制造異常 |throws 抛出異常 |try{ } catch(聲明異常 ){ } finally{} 捕獲異常 finally不管有沒有異常都會執行的代碼,catch可以有多個用于捕獲多個異常,大範圍的異常放在後面.不然後面的小捕獲就是不可達語句
-
catch (Exception e){
System.out.println("接盤俠出現了..."); //可以捕獲所有的異常,放在最後面,接盤俠啊
}
- 對于try catch 而言,try中放置的是可能發生的異常,當真正發生異常時候,執行對應異常的catch内容,try後面的内容都阻斷了,不會發生
異常
* 異常: exception
* Throwable
* / \
* Error Exception
* | / \
* UnChecked Checked Runtime
* Exception Exception Exception
* 異常分為編譯時異常和運作時異常
* Error: 一般是由虛拟機生成并脫出的,程式員不關注
* Exception : 異常,一旦出現異常,如果不解決,程式無法繼續向下執行
* 檢查時異常|編譯時異常:編譯期出現的異常,如果不處理,程式無法運作
* 運作時異常: 出現在程式運作期間,可以通過程式的健壯性處理
*
* 常見的運作時異常:
* 1.類型轉換異常
* 2.空指針異常
* 3.數組索引越界異常
* 4.數組長度負數異常
* 5.數學異常 ArithmeticException
* 6.轉換異常 NumberFormatException
異常處理
* throw : 制造異常
* 處理異常的方式: *********
* throws : 抛出異常
* try..catch :捕獲異常
* try {
可能會出現異常的代碼;
} catch (FileNotFoundException e) {
如果出現這個異常會執行的代碼;
e.printStackTrace(); //列印異常的棧資訊,标紅色的列印異常資訊
} catch (NullPointerException e){
如果出現這個異常會執行的代碼;
}.....
finally{
無論是否出現異常,都會執行finally中的代碼
}
如果一旦try中出現異常了,try中後面的代碼都不會執行了
一個try後面可以跟一個或者多個catch
如果多個catch,大範圍的在後面
自定義異常
* 不是java提供的異常類,根據自己的邏輯業務進行定義,合理的地方使用,注意要直接或者間接繼承異常Exception
public class DefinedException01 {
public static void main(String[] args) {
Person p = new Person();
p.setName("yinwei");
try {
p.setAge(200);
} catch (AgeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(p);
}
}
//自定義異常類
//直接或者間接的繼承自Exception
//運作時異常必須直接或者間接繼承自RuntimeException
//當出現年齡不合法問題(<0||>150),會抛出這個異常
//建立一個異常類名字叫年齡異常,繼承Exception
class AgeException extends Exception{
public AgeException() { //這是異常類的一個空構造
super();
}
public AgeException(String s) { //這是利用父類的異常處理機制傳回一個字元串提示錯誤資訊
super(s);
}
}
class Person { //定義一個類
private String name; //類的參數
private int age; //類的參數
public Person() { //空構造方法
// TODO Auto-generated constructor stub
}
public Person(String name, int age) { //類的全參構造
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException{ //設計異常
if(age<0 || age>150){
//也可以是throw new AgeException(); 這樣就不會有異常提示資訊
throw new AgeException("有異常了,這裡是異常的提示資訊");
}
this.age = age;
}
//重寫toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
運作結果: //可以看出來,沒有指派成功,并且向下運作了 ,因為捕獲處理了異常
com.shsxt.exception01.AgeException: 有異常了,這裡是異常的提示資訊
at com.shsxt.exception01.Person.setAge(DefinedException01.java:70)
at com.shsxt.exception01.DefinedException01.main(DefinedException01.java:16)
Person [name=yinwei, age=0]