異常:
異常也稱bug,分爲編譯異常和運行異常
Java所有異常都是繼承Throwable接口,程序異常是Throwable實現類的對象,Error異常是系統級別的,jdk問題(你解決不了)
Sting a=null;
try{//可能會出現異常的代碼
a.trim();//nullpointerException
}catch(Exception e){//捕獲並處理異常的方法
System.out.println("異常");
}finally{//總是會執行的代碼
}
try可以和多個catch塊配合,處理多個異常。
異常處理機制:
(1)如果執行中出現異常,會自動生成一個異常類對象,該對象交給java系統,這個過程叫抱出(throw);
(2)當Java系統收到該對象,會尋找能處理這異常的代碼並交給它,這個過程叫捕獲(catch)異常;
(3)如果找不到捕獲異常的方法,則停止運行,Java程序也將推出;
拋出異常:
在定義一個方法時,如果不能確定如何處理其中可能出現的異常,可以不在方法中對異常進行處理,而是將可能發生的異常給調用者來處理:
格式(throws)在類頭拋是加“s”,在類中拋是不加“s”;
public double test1(int a,int b)throw Exception{
}
在main方法中,調用者調用的test1方法,必須寫在try{ }中,因爲前面的test1已經拋出異常,必須捕獲;
在main方法中不能throws;
捕獲異常和拋出異常的方式,並不是排它,它們可以結合在一起同時使用;
自定義異常:(可以通過繼承Exception或他的子類來實現自己的異常類)
//自定義異常類
class MyException extends Exception{
public MyException(){//一般而言,自定義異常類會設計兩個構造器,帶參與不帶參,帶參用於傳遞詳細的出錯信息
}
public MyException(String message){
super(message);
}
public String toString(){
return this.getMessage();
}
}
//return和try catch的關係
class Demo6{
public static void main(String[] args){
double d = divide(10,5);
System.out.println(d);
}
public static double divide(int a,int b){
double q = 0;
try{
if(b==0)
throw new MyException("除數不能爲0");
q = a*1.0/b;
return q;//try中的return不起作用
}catch(MyException me){
System.out.println(me);
return q+5;
}finally{//如果finally中有return語句,就以此語句爲返回值
return q+10;
//System.out.println("ff..");
}
}
}
輸出結果爲:除數不能爲零
10.0
try-catch-finally中的return finally{}是不管怎樣的時候都要運行,所以當finally中有return,前面的try、catch中的return沒用,當finally中沒有return時,try、catch中的return纔有用;
子類拋異常要比父類異常範圍小或等於:
import java.io.*;
class Parent{
public void test1()throws ClassNotFoundException,FileNotFoundException{
System.out.println("父類的方法");
}
}
/**
子類方法的異常範圍必須小於等於父類方法的異常範圍
*/
class Son extends Parent{
public void test1()throws ClassNotFoundException,FileNotFoundException{
System.out.println("子類的方法");
}
}