JAVA中異常詳解
- Throwable類:是Java中所有錯誤和異常的父類
Throwable類有兩個子類:一個是錯誤類 Error 一個是異常類 Exception
錯誤是指:類似虛擬機斷電,電腦斷電等在程序中無法解決的問題
異常則是指:程序中執行結果與預期結果不一致
異常有分為編譯器異常(Exception)和運行期異常(RuntimeException)
編譯器異常是指:在程序編寫時出現的異常,編譯器會對編譯期異常做出提示
運行期異常是指:在程序編譯完成,生產.class文件,運行時產生的異常 預期結果與執行結果不一致
下面來列舉五個常見的運行期異常:
- 數組角標(索引)越界異常:ArraayIndexOutOfBoundsException
代碼示例:
1 package com.niubi; 2 3 public class Demo6 { 4 5 public static void main(String[] args) { 6 int[] array=new int[5]; 7 System.out.println(array[6]); //訪問的數組索引越界,屬於運行期異常,編譯器不會有異常提示 8 9 } 10 11 }
這個代碼是運行期異常,運行期的異常提示如下:在異常提示中,提示代碼的第7行有錯誤
2. 空指針異常:NullPointerException
代碼示例:
1 package com.niubi; 2 3 public class Demo7 { 4 5 public static void main(String[] args) { 6 Object object=new Object(); 7 object=null; //object對象被賦值null(空),所以無法調用hashCode方法,為空指針異常 8 System.out.println(object.hashCode());9 10 } 11 12 }
這個代碼是運行期異常,異常提示如下
3. 類型轉換異常:ClassCastException
代碼示例:
1 package com.niubi; 2 3 public class Demo8 { 4 5 public static void main(String[] args) { 6 Object object=new Object(); 7 String string=(String)object; //Object為String的父類,不能向下轉型,所以會出現類型轉換異常 8 System.out.println(string); 9 10 } 11 12 }
類型轉換異常的異常提示如下:
4.輸入不匹配異常:InputMismatchException
代碼示例:
1 package com.niubi; 2 3 import java.util.Scanner; 4 5 public class Demo9 { 6 7 public static void main(String[] args) { 8 Scanner sc=new Scanner(System.in); 9 System.out.println("輸入數字"); 10 int input=sc.nextInt(); //要求輸入數字,但是輸入的是字母 11 System.out.println(input); 12 13 } 14 15 }
異常提示如下:
5.字符串索引越界:StringIndexOutOfBoundsException
代碼示例:
1 package com.niubi; 2 3 public class Demo10 { 4 5 public static void main(String[] args) { 6 String string=new String(); 7 string="abc"; 8 System.out.println(string.charAt(4)); //string只有三個元素,卻要訪問string的第四個元素,會報字符串索引越界 9 10 } 11 12 }
異常提示如下:
學習,了解異常的好處在於:可以提高程序的健壯性。
那麽面對異常,我們該如何處理異常呢?
異常的處理有兩種方式
1.異常的聲明(這種方法不修改異常的代碼,只是提示有異常)
異常聲明的格式如下: 在方法後邊加上 throw 異常名
2.異常的捕獲
try---catch---finally
3.JAVA中異常的產生與運行原理:
產生:如果程序在某個位置發生了異常,程序會在該位置將異常信息封裝成異常對象,並且拋給調用者,由調用者處理,如果調用者無法處理,那麽異常對象會被繼續上拋,直至被拋到JVM(虛擬機)為止。
JVM(虛擬機)並不會對異常進行處理,JVM會將異常信息顯示在控制臺上。
需要註意的是:發生異常的地方,它後面的程序不會被執行。
代碼示例:
1 public class 異常的細節問題 { 2 public static void main(String[] args) throws ParseException { 3 /* fun(); 4 System.out.println("bbbbb");*/ 5 fun1(); 6 } 7 public static void fun() { 8 Scanner sc=new Scanner(System.in); 9 System.out.println(5/sc.nextInt()); 10 System.out.println("aaaaaaa"); 11 } 12 // 異常的聲明 13 public static void fun1() throws ParseException { 14 SimpleDateFormat sf=new SimpleDateFormat("yyyy"); 15 Date st = sf.parse("aas"); 16 System.out.println(st); 17 } 18 }
異常的處理
1. try--catch--finally
格式① try--catch
try{
可能會發生異常的代碼
}
catch(異常的聲明){ //異常聲明的格式:異常的數據類型:異常的變量名稱
進行異常處理的代碼
}
catch(異常的聲明){ //異常聲明的格式:異常的數據類型:異常的變量名稱
進行異常處理的代碼
}
註意:在多catch的情況下:如果各個異常沒有關聯,可以任意順序,但是有子父類的關系,必須子類在前,父類在後
總結:try中寫可能會出現異常的代碼,catch中寫對於異常的處理的代碼,如果異常並沒有發生,則不執行catch中的代碼,如果發生異常,則會進入catch處理異常,並且try中發生異常之後的代碼不會被執行。
try---catch---finally
try{
}
catch{
}
finally{
}
無論異常發生與否,finally中的代碼都會被執行
代碼示例:
1 public class Try_catch_finally { 2 public static void main(String[] args) { 3 Scanner sc=new Scanner(System.in); 4 try { 5 System.out.println(" 請輸入您要進行除法的操作 "); 6 int i=5/sc.nextInt(); 7 System.out.println(i); 8 }catch(ArithmeticException e) { 9 // System.out.println(e.getMessage()); 10 // e.printStackTrace(); 11 // System.out.println(e.toString()); 12 } 13 } 14 } 15 public class Try_catch_finally 異常的處理 { 16 public static void main(String[] args) { 17 Scanner sc=new Scanner(System.in); 18 while (true) { 19 try { 20 System.out.println(" 請輸入您要進行除法的操作 "); 21 int i = 5 / sc.nextInt(); 22 System.out.println(i); 23 // 循環結束 24 break; 25 } catch (ArithmeticException e) { 26 System.out.println(" 除 0 異常,除數不能為 0 ,請重新輸入 "); 27 // 多個異常可以並列 28 } catch (InputMismatchException|ClassCastException e) { 29 System.out.println(" 不能輸入字符,只能是數字 "); 30 sc=new Scanner(System.in); 31 } 32 } 33 } 34 }
自定義異常:
繼承 Exception 獲取 RuntimeException , 但是如果需要傳遞異常信息,需要調用父類有參構造
代碼示例:
1 public class Topic1 { 2 public static void main(String[] args) { 3 Student s=new Student(); 4 int age=150; 5 try { 6 // int i=5/0; 7 s.setAge(age); 8 } catch (AgeException e) { 9 // TODO Auto-generated catch block 10 System.out.println("====="); 11 // e.printStackTrace(); 12 System.out.println(e.getMessage()); 13 } 14 } 15 } 16 class Student { 17 String name; 18 int age; 19 public void setAge(int age) throws AgeException{ 20 if(age>120||age<0) { 21 // 拋出異常對象 22 throw new AgeException(" 年齡不合法 "); 23 } 24 this.age=age; 25 } 26 } 27 // 自定義異常 : 繼承 (具有父類的特點 ) Exception 或 RuntimeException 28 class AgeException extends Exception{ 29 public AgeException(String msg) { 30 // 必須通過調用父類的有參構造來傳遞異常信息。 31 super(msg); 32 } 33 }
JAVA中異常詳解