在使用計算機語言進行項目開發的過程中,即使程序員把代碼寫得盡善盡美,在系統的運行過程中仍然會遇到一些問題,因爲很多問題不是靠代碼能夠避免的,比如:客戶輸入數據的格式,讀取文件是否存在,網絡是否始終保持通暢等等。
java異常體系:
* java.lang.Throwable
* |-----Error:錯誤,程序中不進行處理
* |-----Exception:異常,要求在編寫程序時,就要考慮到對這些異常的處理
* |-----編譯時異常:在編譯期間會出現的異常(執行javac.exe命令時,出現異常)
* |-----運行時異常:在運行期間出現的異常(執行java.exe命令時,出現異常)
當執行一個程序時,如果出現異常,那麼異常之後的代碼就不再執行!
//編譯時異常
@Test
public void test6(){
FileInputStream fis = new FileInputStream(new File("hello.txt"));
int b;
while((b = fis.read()) != -1){
System.out.println((char)b);
}
fis.close();
}
//常見的運行時異常
/*
* Bank bank = new Bank();
* Customer[] customers = new Customer[5];
* customers[0] = new Customer();
* System.out.println(customers[0].getFirstName());可能出現空指針異常
* customers[0].setAccount(new Account(200));
* customers[0].getAccount().withdraw(100);可能出現空指針異常
*/
//4.空指針異常:NullPointerExcetion
@Test
public void test5(){
// Person p = new Person();
// p = null;
// System.out.println(p.toString());
String str = new String("AA");
str = null;
System.out.println(str.length());
}
//3.類型轉換異常:ClassCastException
@Test
public void test4(){
Object obj = new Date();
String str = (String)obj;
//String str1 = (String)new Date();
}
//2.算術異常:ArithmeticException
@Test
public void test3(){
int i = 10;
System.out.println(i / 0);
}
//1.數組下標越界的異常:ArrayIndexOutOfBoundsException
@Test
public void test2(){
int[] i = new int[10];
//System.out.println(i[10]);
System.out.println(i[-10]);
}
如何處理Exception的異常
* Java提供的是異常處理的抓拋模型
* 1."拋":當我們執行代碼時,一旦出現異常,就會在異常的代碼處生成一個對應的異常類型的對象,並
* 將此對象拋出。(自動拋出 / 手動拋出)
* >一旦拋出此異常類的對象,那麼程序就終止執行(人爲拋出的也會終止)
* >此異常類的對象拋給方法的調用者。
* 2."抓":抓住上一步拋出來的異常類的對象。如何抓?即爲異常處理的方式
* java 提供了兩種方式用來處理一個異常類的對象。
* 處理的方式一:
* try{
* //可能出現異常的代碼①
②
* }catch(Exception1 e1){
* //處理的方式1
* }catch(Exception2 e2){
* //處理的方式2
* }finally{
* //一定要執行的代碼
* }
①發生異常後,②不會再執行。try中發生異常後,異常之後的代碼不會執行,而是直接執行catch中的代碼。
* 注:1.try內聲明的變量,類似於局部變量,出了try{}語句,就不能被調用
* 2.finally是可選的。
* 3.catch語句內部是對異常對象的處理:
* >getMessage(); printStackTrace();
* 4.可以有多個catch語句,try中拋出的異常類對象從上往下去匹配catch中的異常類的類型,一旦滿足
* 就執行catch中的代碼。執行完,就跳出其後的多條catch語句
* 5.如果異常處理了,那麼其後的代碼繼續執行。
* 6.若catch中多個異常類型是"並列"關係,孰上孰下都可以。
* 若catch中多個異常類型是"包含"關係,須將子類放在父類的上面,進行處理。否則報錯!
* 7.finally中存放的是一定會被執行的代碼,不管try中、catch中是否仍有異常未被處理,以及是否有return語句。
* 8.try-catch是可以嵌套的。
聲明拋出異常是Java中處理異常的第二種方式:
異常處理的方式二:在方法的聲明處,顯式的拋出該異常對象的類型
* 格式:如:public static void method2() throws FileNotFoundException,IOException{}
* 當在此方法內部出現異常的時候,會拋出一個異常類的對象,拋給方法的調用者。
* 異常的對象可以逐層向上拋,直至main中。當然在向上拋的過程中,可以再通過try-catch-finally進行處理。
//1.手動的拋出一個異常的例子(throw new RuntimeException("傳入的類型有誤!");)
//2.拋出的異常類型:若是RuntimeException,可以不顯式的處理
//若是一個Exception,必須要顯式的處理。
java的異常處理:抓拋模型
* 1.抓:異常的處理,有兩種方式(①try-catch-finally② throws + 異常的類型)
* 2.拋:一旦執行過程中,出現異常,會拋出一個異常類的對象。(自動的拋出 vs 手動的拋出(throw + 異常類的對象))
* >異常類,既可以是現成的異常類,也可以是自己創建的異常類
自定義異常:
//如何自定義一個異常類(根據現有的異常類去寫)
//1.自定義的異常類繼承現有的異常類
//2.提供一個序列號,提供幾個重載的構造器
public class MyException extends Exception{
static final long serialVersionUID = -70348975766939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
//子類重寫的父類的方法,其拋出的異常類型只能是被重寫的方法的異常類的子類或異常類型一樣。