我的理解:java
所謂異常就是對你的操做(調用方法等)進行斷定,要是編譯期異常的話則進行兩種處理,要是運行時異常則不須要處理,須要的是修改代碼。咱們能夠進行自定義異常,畢竟不知道用戶輸入究竟是什麼,只是須要咱們進行斷定就能夠了。面試
面試題:sql
1:編譯期異常和運行期異常的區別?數組
編譯期異常 必需要處理的,不然編譯不經過併發
運行期異常 能夠不處理,也能夠處理oracle
2:throw和throws是的區別jvm
throw:spa
在方法體中,後面跟的是異常對象名,而且只能是一個指針
throw拋出的是一個異常對象,說明這裏確定有一個異常產生了code
throws:
在方法聲明上,後面跟的是異常的類名,能夠是多個
throws是聲明方法有異常,是一種可能性,這個異常並不必定會產生
3.若是在catch裏面有return,請問finally還執行嗎?若是執行,在return前仍是後
會,前。
異常的注意實現
A:父的方法有異常拋出,子的重寫方法在拋出異常的時候必需要小於等於父的異常
B:父的方法沒有異常拋出,子的重寫方法不能有異常拋出
C:父的方法拋出多個異常,子的重寫方法必須比父少或者小
如何使用異常處理:
原則:若是該功能內部能夠將問題處理,用try,若是處理不了,交給調用者處理,這就是用throws;
區別:
一、後續程序須要繼續運行就try;
二、後續程序不須要繼續運行就throws;
若是jdk中沒有提供對應的異常,須要自定義異常。
1、簡介:
什麼是異常?Java代碼在運行時期發生的問題就是異常。
在Java中,把異常信息封裝成了一個類。當出現了問題時,就會建立異常類對象並拋出異常相關的信息(如異常出現的位置、緣由等)。
2、異常繼承體系:
一、在Java中使用Exception類來描述異常。
二、Exception 類及其子類是 Throwable 的一種形式,它用來表示java程序中可能會產生的異常,並要求對產生的異常進行合理的異常處理。
三、Throwable是Java 語言中全部錯誤或異常的超類,即祖宗類。
四、RuntimeException及其它的子類只能在Java程序運行過程當中出現。
五、與異常Exception平級的有一個Error,它是Throwable的子類,它用來表示java程序中可能會產生的嚴重錯誤。解決辦法只有一個,修改代碼避免Error錯誤的產生。
總結:
Throwable: 它是全部錯誤與異常的超類(祖宗類)
- Error 錯誤(處理不了,必須修改代碼)
- Exception 編譯期異常,進行編譯JAVA程序時出現的問題(有可能改)
- RuntimeException 運行期異常, JAVA程序運行過程當中出現的問題
3、異常與錯誤的區別:
一、異常:指程序在編譯、運行期間發生了某種異常(XxxException),咱們能夠對異常進行具體的處理。若不處理異常,程序將會結束運行。
二、錯誤:指程序在運行期間發生了某種錯誤(XxxError),Error錯誤一般沒有具體的處理方式,程序將會結束運行。Error錯誤的發生每每都是系統級別的問題,都是jvm所在系統發生的,並反饋給jvm的。咱們沒法針對處理,只能修正代碼。
4、異常產生解析:
一、JVM檢測到異常;二、建立異常對象(new);三、將異常對象拋給調用者(main是最後一層);四、如果沒有處理的則JVM處理:
①、結束程序;
②、以紅字的方式將異常狀況(對象、信息、位置)打印在控制檯。
5、拋出異常throw:
一、在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。那麼,拋出一個異常具體如何操做呢?
①、建立一個異常對象。封裝一些提示信息(信息能夠本身編寫)。
②、須要將這個異常對象告知給調用者。怎麼告知呢?怎麼將這個異常對象傳遞到調用者處呢?經過關鍵字throw就能夠完成。throw 異常對象;
throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。
使用格式:
throw new 異常類名(參數);
6、聲明異常throws:
聲明:將問題標識出來,報告給調用者。若是方法內經過throw拋出了編譯時異常,而沒有捕獲處理(稍後講解該方式),那麼必須經過throws進行聲明,讓調用者去處理。
聲明異常格式:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2… { }
throws用於進行異常類的聲明,若該方法可能有多種異常狀況產生,那麼在throws後面能夠寫多個異常類,用逗號隔開。
7、捕獲異常:
捕獲:Java中對異常有針對性的語句進行捕獲,能夠對出現的異常進行指定方式的處理。
try { //須要被檢測的語句。 } catch(異常類 變量) { //參數。 //異常的處理語句。 } finally { //必定會被執行的語句。 }
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
finally:有一些特定的代碼不管異常是否發生,都須要執行。另外,由於異常會引起程序跳轉,致使有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是必定會被執行的。
8、try.....catch....finally異常處理的組合方式:
一、try catch finally組合:檢測異常,並傳遞給catch處理,並在finally中進行資源釋放。
二、 try catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對異常進行捕獲處理。
package com.oracle.demo01; public class Demo04 { public static void main(String[] args) { int [] arr={}; //可能會發生異常的語句 int a=get(arr);//能夠點第2個或者第3個 System.out.println(a); } public static int get(int[] arr) throws ArrayIndexOutOfBoundsException ,NullPointerException ,Exception { //若異常有一個定義爲Exception,能夠單寫Exception。由於Exception是全部的父類 if(arr==null){ throw new NullPointerException("數組爲空!"); } if(arr.length==0){ throw new ArrayIndexOutOfBoundsException("數組長度爲0!");//均可以寫Exception,由於Exception是全部的父類 } int i=arr[arr.length-1]; return i; } }
三、一個try 多個catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對每種異常信息進行不一樣的捕獲處理。
注意:這種異常處理方式,要求多個catch中的異常不能相同,而且若catch中的多個異常之間有子父類異常的關係,那麼子類異常要求在上面的catch處理,父類異常在下面的catch處理。
四、try finally 組合: 對代碼進行異常檢測,檢測到異常後由於沒有catch,因此同樣會被默認jvm拋出。異常是沒有捕獲處理的。可是功能所開啓資源須要進行關閉,全部finally。只爲關閉資源。(虛擬機處理—結束程序、報錯;finally仍是執行的)
package com.oracle.demo01; public class Demo02 { public static void main(String[] args) throws Exception{ int [] arr={}; try{ //可能會發生異常的語句 int a=get(arr); System.out.println(a); }catch(NullPointerException ex){//catch裏面是可能報的異常 將new Exception("數組長度爲0!")賦值給ex //若是發生異常怎麼處理 System.out.println(ex); }catch(ArrayIndexOutOfBoundsException ex){//ex爲局部變量,與上面那個不在一個塊內,能夠重複 System.out.println(ex); }catch(Exception ex){//若存在父類Exception,必須寫在最後面 System.out.println(ex); }finally{ //無論發不發生異常都會執行的語句 System.out.println("finally執行了。"); } System.out.println("程序沒有結束!"); } public static int get(int[] arr) throws ArrayIndexOutOfBoundsException ,NullPointerException { //若異常有一個定義爲Exception,能夠單寫Exception。由於Exception是全部的父類 if(arr==null){ throw new NullPointerException("數組爲空!"); } if(arr.length==0){ throw new ArrayIndexOutOfBoundsException("數組長度爲0!");//均可以寫Exception,由於Exception是全部的父類 } int i=arr[arr.length-1]; return i; } }
9、運行時期異常:
一、 RuntimeException和他的全部子類異常,都屬於運行時期異常。
NullPointerException(空指針),ArrayIndexOutOfBoundsException(數組越界)、ClassCastException(類轉換異常)、NumberFormatException(數字格式異常--數字轉換異常)、
java.util.ConcurrentModificationException(併發修改異常)、SQLException(sql異常) 等都屬於運行時期異常。
二、運行時期異常的特色:
①、方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常;
②、運行時期異常一旦發生,須要程序人員修改源代碼。
10、異常在方法重寫中的細節:
一、子類覆蓋父類方法時,若是父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。
二、 當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集。
三、當被覆蓋的方法沒有異常聲明時,子類覆蓋時沒法聲明異常的。
問題:接口中沒有聲明異常,而實現的子類覆蓋方法時發生了異常,怎麼辦?
答:沒法進行throws聲明,只能catch的捕獲。萬一問題處理不了呢?catch中繼續throw拋出,可是隻能將異常轉換成RuntimeException子類拋出。
package com.oracle.demo01; import java.text.ParseException; public class Fu { public void f()throws ParseException{ } }
package com.oracle.demo01; import java.text.ParseException; public class Zi extends Fu{ public void f()throws ParseException{ } }
11、異常中經常使用的方法:
一、getMessage方法:返回該異常的詳細信息字符串,即異常提示信息。
二、toString方法:返回該異常的名稱與詳細信息字符串。
三、printStackTrace:在(紅字的方式)控制檯輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置。
package com.oracle.demo01; public class Demo06 { public static void main(String[] args) throws Exception{ int [] arr={}; try{ //可能會發生異常的語句 int a=get(arr); System.out.println(a); }catch(Exception ex){//若存在父類Exception,必須寫在最後面 //getMessage()只打印異常信息 //System.out.println(ex.getMessage()); //toString()打印異常對象和異常信息 //System.out.println(ex.toString()); //以紅字的方式打印異常對象、信息、位置 ex.printStackTrace(); }finally{ //無論發不發生異常都會執行的語句 System.out.println("finally執行了。"); } System.out.println("程序沒有結束!"); } public static int get(int[] arr) throws ArrayIndexOutOfBoundsException ,NullPointerException { //若異常有一個定義爲Exception,能夠單寫Exception。由於Exception是全部的父類 if(arr==null){ throw new NullPointerException("數組爲空!"); } if(arr.length==0){ throw new ArrayIndexOutOfBoundsException("數組長度爲0!");//均可以寫Exception,由於Exception是全部的父類 } int i=arr[arr.length-1]; return i; } }
12、自定義異常:
Class 異常名 extends Exception{ //或繼承RuntimeException public 異常名(){ } public 異常名(String s){ super(s); } }
package com.oracle.demo01; public class Demo07 { public static void main(String[] args) { int []arr={7,3,4,5,22,33,-44}; double num=avg(arr); System.out.println(num); } //寫個方法求平均數 public static double avg(int[] arr){ int sum=0; for(int i:arr){ if(i<0){ throw new FuShuException("負數異常"+i); } sum+=i; } return sum/arr.length; } }
package com.oracle.demo01; public class FuShuException extends RuntimeException{ public FuShuException(String s){ //調用父類RuntimeException的方法,讓他進行輸出,要不不會打印 super(s); } }