1. 程式人生 > >JAVA中異常詳解

JAVA中異常詳解

image scanner 執行c 地方 nbsp point 情況 ktr ==

  1. Throwable類:是Java中所有錯誤和異常的父類

Throwable類有兩個子類:一個是錯誤類 Error 一個是異常類 Exception

錯誤是指:類似虛擬機斷電,電腦斷電等在程序中無法解決的問題

異常則是指:程序中執行結果與預期結果不一致

異常有分為編譯器異常(Exception)和運行期異常(RuntimeException)

編譯器異常是指:在程序編寫時出現的異常,編譯器會對編譯期異常做出提示

運行期異常是指:在程序編譯完成,生產.class文件,運行時產生的異常 預期結果與執行結果不一致

下面來列舉五個常見的運行期異常:

  1. 數組角標(索引)越界異常: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中異常詳解