一、異常的概述和分類
1、異常的概述:異常就是java程序在運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤。
2、異常的分類
(1)Error:服務(wù)器宕機(jī),數(shù)據(jù)庫(kù)崩潰等
(2)Exception
3、異常的繼承體系
Throwable
Error
Exception
RuntimeException
二、JVM默認(rèn)是如何處理異常的
main函數(shù)收到這個(gè)問(wèn)題時(shí),有兩種處理方式:
自己將該問(wèn)題處理,然后繼續(xù)運(yùn)行
自己沒(méi)有針對(duì)的處理方式,只有交給調(diào)用main的jvm來(lái)處理
jvm有一個(gè)默認(rèn)的異常處理機(jī)制,就將該異常進(jìn)行處理.
并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺(tái)上,同時(shí)將程序停止運(yùn)行
三、try...catch的方式處理異常
異常處理的兩種方式
1、try…catch…finally
try catch
try catch finally
try finally
2、throws
try...catch處理異常的基本格式
try…catch…finally
try:用來(lái)檢測(cè)異常
catch:用來(lái)捕獲異常
finally:釋放資源
try后面如果跟多個(gè)catch,那么小的異常放在前面,大的異常放在后面,根據(jù)多態(tài)原理,如果大的放 在前面,就會(huì)將所有子類對(duì)象接收,后面的catch就沒(méi)有意義了;
Android開(kāi)發(fā)處理異常:try{}catch(Exception e){}
JavaEE服務(wù)端開(kāi)發(fā)處理異常:一般都是底層開(kāi)發(fā),從底層向上拋,如果使用try...catch會(huì)隱藏異常,
帶來(lái)巨大隱患,如果異常全部爆發(fā)那后果不堪設(shè)想
四、編譯期異常和運(yùn)行期異常的區(qū)別
Java中的異常被分為兩大類:編譯時(shí)異常和運(yùn)行時(shí)異常。
所有的RuntimeException類及其子類的實(shí)例被稱為運(yùn)行時(shí)異常,其他的異常就是編譯時(shí)異常
編譯時(shí)異常
Java程序必須顯示處理,否則程序就會(huì)發(fā)生錯(cuò)誤,無(wú)法通過(guò)編譯
運(yùn)行時(shí)異常
無(wú)需顯示處理,也可以和編譯時(shí)異常一樣處理
五、Throwable的幾個(gè)常見(jiàn)方法
1、getMessage()
獲取異常信息,返回字符串。
2、toString()
獲取異常類名和異常信息,返回字符串。
3、PRintStackTrace()
獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。
六、throws的方式處理異常
定義功能方法時(shí),需要把出現(xiàn)的問(wèn)題暴露出來(lái)讓調(diào)用者去處理。
那么就通過(guò)throws在方法上標(biāo)識(shí)。
七、throw的概述以及和throws的區(qū)別
throw的概述
在功能方法內(nèi)部出現(xiàn)某種情況,程序不能繼續(xù)運(yùn)行,需要進(jìn)行跳轉(zhuǎn)時(shí),就用throw把異常對(duì)象拋出。
throws和throw的區(qū)別
throws
用在方法聲明后面,跟的是異常類名
可以跟多個(gè)異常類名,用逗號(hào)隔開(kāi)
表示拋出異常,由該方法的調(diào)用者來(lái)處理
throw
用在方法體內(nèi),跟的是異常對(duì)象名
只能拋出一個(gè)異常對(duì)象名
表示拋出異常,由方法體內(nèi)的語(yǔ)句處理
八、finally關(guān)鍵字的特點(diǎn)及作用
1、finally的特點(diǎn)
被finally控制的語(yǔ)句體一定會(huì)執(zhí)行
特殊情況:在執(zhí)行到finally之前jvm退出了(比如System.exit(0))
2、finally的作用
用于釋放資源,在IO流操作和數(shù)據(jù)庫(kù)操作中會(huì)見(jiàn)到
3、final,finally,finalize區(qū)別
(1)final可以修飾類:不能被繼承
修飾方法:不能被重寫(xiě)
修飾變量:只能賦值一次
(2)finally是try語(yǔ)句中的一個(gè)語(yǔ)句體,不能被單獨(dú)使用,用來(lái)釋放資源
(3)finalize是Object一個(gè)方法,當(dāng)垃圾回收期確定不存在該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法
九、異常注意事項(xiàng)
(1)子類重寫(xiě)父類方法時(shí),子類的方法必須拋出相同的異常或父類異常的子類
(2)如果父類拋出了多個(gè)異常,子類重寫(xiě)父類時(shí),只能拋出相同的異常或者是他的子集,子類不能拋出父類沒(méi)有的異常
(3)如果被重寫(xiě)的方法沒(méi)有異常拋出,那么子類的方法絕對(duì)不可以拋出異常,如果子類方法內(nèi)有異常發(fā)生,那么子類只能try,不能throws
如何使用異常處理
原則:如果該功能內(nèi)部可以將問(wèn)題處理,用try,如果處理不了,交由調(diào)用者處理,這是用throws
區(qū)別:
后續(xù)程序需要繼續(xù)運(yùn)行就try
后續(xù)程序不需要繼續(xù)運(yùn)行就throws
如果JDK沒(méi)有提供對(duì)應(yīng)的異常,需要自定義異常
public class ExceptionClass { public static void main(String[] args) throws AgeOutException { /* * 一、異常的概述和分類 1、異常的概述:異常就是Java程序在運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤。 2、異常的分類 (1)Error:服務(wù)器宕機(jī),數(shù)據(jù)庫(kù)崩潰等 (2)Exception 3、異常的繼承體系 Throwable Error Exception RuntimeException 二、JVM默認(rèn)是如何處理異常的 main函數(shù)收到這個(gè)問(wèn)題時(shí),有兩種處理方式: 自己將該問(wèn)題處理,然后繼續(xù)運(yùn)行 自己沒(méi)有針對(duì)的處理方式,只有交給調(diào)用main的jvm來(lái)處理 jvm有一個(gè)默認(rèn)的異常處理機(jī)制,就將該異常進(jìn)行處理. 并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺(tái)上,同時(shí)將程序停止運(yùn)行 三、try...catch的方式處理異常 異常處理的兩種方式 1、try…catch…finally try catch try catch finally try finally 2、throws try...catch處理異常的基本格式 try…catch…finally try:用來(lái)檢測(cè)異常 catch:用來(lái)捕獲異常 finally:釋放資源 try后面如果跟多個(gè)catch,那么小的異常放在前面,大的異常放在后面,根據(jù)多態(tài)原理,如果大的放在前面 就會(huì)將所有子類對(duì)象接收,后面的catch就沒(méi)有意義了; Android開(kāi)發(fā)處理異常:try{}catch(Exception e){} JavaEE服務(wù)端開(kāi)發(fā)處理異常:一般都是底層開(kāi)發(fā),從底層向上拋,如果使用try...catch會(huì)隱藏異常, 帶來(lái)巨大隱患,如果異常全部爆發(fā)那后果不堪設(shè)想 四、編譯期異常和運(yùn)行期異常的區(qū)別 Java中的異常被分為兩大類:編譯時(shí)異常和運(yùn)行時(shí)異常。 所有的RuntimeException類及其子類的實(shí)例被稱為運(yùn)行時(shí)異常,其他的異常就是編譯時(shí)異常 編譯時(shí)異常 Java程序必須顯示處理,否則程序就會(huì)發(fā)生錯(cuò)誤,無(wú)法通過(guò)編譯 運(yùn)行時(shí)異常 無(wú)需顯示處理,也可以和編譯時(shí)異常一樣處理 五、Throwable的幾個(gè)常見(jiàn)方法 1、getMessage() 獲取異常信息,返回字符串。 2、toString() 獲取異常類名和異常信息,返回字符串。 3、printStackTrace() 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。 六、throws的方式處理異常 定義功能方法時(shí),需要把出現(xiàn)的問(wèn)題暴露出來(lái)讓調(diào)用者去處理。 那么就通過(guò)throws在方法上標(biāo)識(shí)。 七、throw的概述以及和throws的區(qū)別 throw的概述 在功能方法內(nèi)部出現(xiàn)某種情況,程序不能繼續(xù)運(yùn)行,需要進(jìn)行跳轉(zhuǎn)時(shí),就用throw把異常對(duì)象拋出。 throws和throw的區(qū)別 throws 用在方法聲明后面,跟的是異常類名 可以跟多個(gè)異常類名,用逗號(hào)隔開(kāi) 表示拋出異常,由該方法的調(diào)用者來(lái)處理 throw 用在方法體內(nèi),跟的是異常對(duì)象名 只能拋出一個(gè)異常對(duì)象名 表示拋出異常,由方法體內(nèi)的語(yǔ)句處理 八、finally關(guān)鍵字的特點(diǎn)及作用 1、finally的特點(diǎn) 被finally控制的語(yǔ)句體一定會(huì)執(zhí)行 特殊情況:在執(zhí)行到finally之前jvm退出了(比如System.exit(0)) 2、finally的作用 用于釋放資源,在IO流操作和數(shù)據(jù)庫(kù)操作中會(huì)見(jiàn)到 3、final,finally,finalize區(qū)別 (1)final可以修飾類:不能被繼承 修飾方法:不能被重寫(xiě) 修飾變量:只能賦值一次 (2)finally是try語(yǔ)句中的一個(gè)語(yǔ)句體,不能被單獨(dú)使用,用來(lái)釋放資源 (3)finalize是Object一個(gè)方法,當(dāng)垃圾回收期確定不存在該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法 九、異常注意事項(xiàng) (1)子類重寫(xiě)父類方法時(shí),子類的方法必須拋出相同的異常或父類異常的子類 (2)如果父類拋出了多個(gè)異常,子類重寫(xiě)父類時(shí),只能拋出相同的異常或者是他的子集,子類不能拋出父類沒(méi)有的異常 (3)如果被重寫(xiě)的方法沒(méi)有異常拋出,那么子類的方法絕對(duì)不可以拋出異常,如果子類方法內(nèi)有異常發(fā)生,那么子類只能try,不能throws 如何使用異常處理 原則:如果該功能內(nèi)部可以將問(wèn)題處理,用try,如果處理不了,交由調(diào)用者處理,這是用throws 區(qū)別: 后續(xù)程序需要繼續(xù)運(yùn)行就try 后續(xù)程序不需要繼續(xù)運(yùn)行就throws 如果JDK沒(méi)有提供對(duì)應(yīng)的異常,需要自定義異常 * */ 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("我執(zhí)行了"); } } 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); //默認(rèn)調(diào)用toString方法 e.printStackTrace(); //jvm默認(rèn)調(diào)用此方法處理異常 } System.out.println(); } private static void moreCatch1() { System.out.println("==========多個(gè)catch,JDK7==========="); int[] arr = {11,22,33}; int a = 10; int b = 0; //JDK7處理多個(gè)異常添加 |或 運(yùn)算符 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("==========多個(gè)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("出錯(cuò)了,除數(shù)為0了"); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("數(shù)組索引越界"); }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("出錯(cuò)了,除數(shù)為0了"); } System.out.println("處理異常可以繼續(xù)往下執(zhí)行,不處理直接崩潰"); }}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); }}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注