一、異常的概述和分類
1、異常的概述:異常就是java程序在運行過程中出現的錯誤。
2、異常的分類
(1)Error:服務器宕機,數據庫崩潰等
(2)Exception
3、異常的繼承體系
Throwable
Error
Exception
RuntimeException
二、JVM默認是如何處理異常的
main函數收到這個問題時,有兩種處理方式:
自己將該問題處理,然后繼續運行
自己沒有針對的處理方式,只有交給調用main的jvm來處理
jvm有一個默認的異常處理機制,就將該異常進行處理.
并將該異常的名稱,異常的信息.異常出現的位置打印在了控制臺上,同時將程序停止運行
三、try...catch的方式處理異常
異常處理的兩種方式
1、try…catch…finally
try catch
try catch finally
try finally
2、throws
try...catch處理異常的基本格式
try…catch…finally
try:用來檢測異常
catch:用來捕獲異常
finally:釋放資源
try后面如果跟多個catch,那么小的異常放在前面,大的異常放在后面,根據多態原理,如果大的放 在前面,就會將所有子類對象接收,后面的catch就沒有意義了;
Android開發處理異常:try{}catch(Exception e){}
JavaEE服務端開發處理異常:一般都是底層開發,從底層向上拋,如果使用try...catch會隱藏異常,
帶來巨大隱患,如果異常全部爆發那后果不堪設想
四、編譯期異常和運行期異常的區別
Java中的異常被分為兩大類:編譯時異常和運行時異常。
所有的RuntimeException類及其子類的實例被稱為運行時異常,其他的異常就是編譯時異常
編譯時異常
Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯
運行時異常
無需顯示處理,也可以和編譯時異常一樣處理
五、Throwable的幾個常見方法
1、getMessage()
獲取異常信息,返回字符串。
2、toString()
獲取異常類名和異常信息,返回字符串。
3、PRintStackTrace()
獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
六、throws的方式處理異常
定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。
那么就通過throws在方法上標識。
七、throw的概述以及和throws的區別
throw的概述
在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。
throws和throw的區別
throws
用在方法聲明后面,跟的是異常類名
可以跟多個異常類名,用逗號隔開
表示拋出異常,由該方法的調用者來處理
throw
用在方法體內,跟的是異常對象名
只能拋出一個異常對象名
表示拋出異常,由方法體內的語句處理
八、finally關鍵字的特點及作用
1、finally的特點
被finally控制的語句體一定會執行
特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
2、finally的作用
用于釋放資源,在IO流操作和數據庫操作中會見到
3、final,finally,finalize區別
(1)final可以修飾類:不能被繼承
修飾方法:不能被重寫
修飾變量:只能賦值一次
(2)finally是try語句中的一個語句體,不能被單獨使用,用來釋放資源
(3)finalize是Object一個方法,當垃圾回收期確定不存在該對象的更多引用時,由對象的垃圾回收器調用此方法
九、異常注意事項
(1)子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類
(2)如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異?;蛘呤撬淖蛹?子類不能拋出父類沒有的異常
(3)如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws
如何使用異常處理
原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
區別:
后續程序需要繼續運行就try
后續程序不需要繼續運行就throws
如果JDK沒有提供對應的異常,需要自定義異常
public class ExceptionClass { public static void main(String[] args) throws AgeOutException { /* * 一、異常的概述和分類 1、異常的概述:異常就是Java程序在運行過程中出現的錯誤。 2、異常的分類 (1)Error:服務器宕機,數據庫崩潰等 (2)Exception 3、異常的繼承體系 Throwable Error Exception RuntimeException 二、JVM默認是如何處理異常的 main函數收到這個問題時,有兩種處理方式: 自己將該問題處理,然后繼續運行 自己沒有針對的處理方式,只有交給調用main的jvm來處理 jvm有一個默認的異常處理機制,就將該異常進行處理. 并將該異常的名稱,異常的信息.異常出現的位置打印在了控制臺上,同時將程序停止運行 三、try...catch的方式處理異常 異常處理的兩種方式 1、try…catch…finally try catch try catch finally try finally 2、throws try...catch處理異常的基本格式 try…catch…finally try:用來檢測異常 catch:用來捕獲異常 finally:釋放資源 try后面如果跟多個catch,那么小的異常放在前面,大的異常放在后面,根據多態原理,如果大的放在前面 就會將所有子類對象接收,后面的catch就沒有意義了; Android開發處理異常:try{}catch(Exception e){} JavaEE服務端開發處理異常:一般都是底層開發,從底層向上拋,如果使用try...catch會隱藏異常, 帶來巨大隱患,如果異常全部爆發那后果不堪設想 四、編譯期異常和運行期異常的區別 Java中的異常被分為兩大類:編譯時異常和運行時異常。 所有的RuntimeException類及其子類的實例被稱為運行時異常,其他的異常就是編譯時異常 編譯時異常 Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯 運行時異常 無需顯示處理,也可以和編譯時異常一樣處理 五、Throwable的幾個常見方法 1、getMessage() 獲取異常信息,返回字符串。 2、toString() 獲取異常類名和異常信息,返回字符串。 3、printStackTrace() 獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。 六、throws的方式處理異常 定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。 那么就通過throws在方法上標識。 七、throw的概述以及和throws的區別 throw的概述 在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。 throws和throw的區別 throws 用在方法聲明后面,跟的是異常類名 可以跟多個異常類名,用逗號隔開 表示拋出異常,由該方法的調用者來處理 throw 用在方法體內,跟的是異常對象名 只能拋出一個異常對象名 表示拋出異常,由方法體內的語句處理 八、finally關鍵字的特點及作用 1、finally的特點 被finally控制的語句體一定會執行 特殊情況:在執行到finally之前jvm退出了(比如System.exit(0)) 2、finally的作用 用于釋放資源,在IO流操作和數據庫操作中會見到 3、final,finally,finalize區別 (1)final可以修飾類:不能被繼承 修飾方法:不能被重寫 修飾變量:只能賦值一次 (2)finally是try語句中的一個語句體,不能被單獨使用,用來釋放資源 (3)finalize是Object一個方法,當垃圾回收期確定不存在該對象的更多引用時,由對象的垃圾回收器調用此方法 九、異常注意事項 (1)子類重寫父類方法時,子類的方法必須拋出相同的異?;蚋割惍惓5淖宇? (2)如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異?;蛘呤撬淖蛹?子類不能拋出父類沒有的異常 (3)如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws 如何使用異常處理 原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws 區別: 后續程序需要繼續運行就try 后續程序不需要繼續運行就throws 如果JDK沒有提供對應的異常,需要自定義異常 * */ demo(); div(); moreCatch(); moreCatch1(); throwable();// throwss(); finallys(); } private static void finallys() { System.out.println("==========finally==========="); try{ System.out.println(10/0); }catch (Exception e) { System.out.println("程序異常"); }finally { System.out.println("我執行了"); } } private static void throwss() throws AgeOutException { System.out.println("==========throws==========="); Person p = new Person(); p.setAge(-10); System.out.println(p.getAge()); System.out.println(); } private static void throwable() { System.out.println("==========Throwable==========="); try{ System.out.println(10/0); }catch (Exception e) { System.out.println(e.getMessage()); System.out.println(e); //默認調用toString方法 e.printStackTrace(); //jvm默認調用此方法處理異常 } System.out.println(); } private static void moreCatch1() { System.out.println("==========多個catch,JDK7==========="); int[] arr = {11,22,33}; int a = 10; int b = 0; //JDK7處理多個異常添加 |或 運算符 try { System.out.println(a/b);; System.out.println(arr[5]); } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println("異常了"); } } private static void moreCatch() { System.out.println("==========多個catch==========="); int[] arr = {11,22,33}; int a = 10; int b = 0; try { int x = a/b; System.out.println(arr[5]); arr = null; System.out.println(arr[4]); } catch (ArithmeticException e) { System.out.println("出錯了,除數為0了"); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("數組索引越界"); }catch (Exception e){ System.out.println("其他異常"); } } private static void demo() { int[] arr = {11,22,33};// arr = null;// System.out.println(arr[0]); //NullPointerException// System.out.println(arr[5]); //異常信息從下往上看,第二行指出異常在哪一行,第一行指出哪種類型異常 /*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at com.lin.exception.ExceptionClass.main(ExceptionClass.java:27)*/ } private static void div() { System.out.println("==========try...catch==========="); try{ int x = 10/0; System.out.println(x); }catch(ArithmeticException a){ System.out.println("出錯了,除數為0了"); } System.out.println("處理異??梢岳^續往下執行,不處理直接崩潰"); }}class Person{ private int age; private String name; public Person() { super(); } public Person(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) throws AgeOutException { if(age >= 0 && age <= 150){ this.age = age; }else{// throw new Exception("年齡非法"); throw new AgeOutException("年齡非法"); } } public String getName() { return name; } public void setName(String name) { this.name = name; }}class AgeOutException extends Exception{ public AgeOutException() { super(); } public AgeOutException(String message) { super(message); }}
新聞熱點
疑難解答