標籤:自訂異常類 核心 路徑 必須 pack 命名 def 指定 雙擊
java異常體系異常的體系:
異常體系:--------| Throwable 所有錯誤或者異常的父類--------------| Error(錯誤)--------------| Exception(異常) 異常一般都通過代碼處理 --------------------| 運行時異常: 如果一個方法內部拋出了一個運行時異常,那麼方法上 可以聲明也可以不 聲明,調用者可以以處理也可以不處理。--------------------| 編譯時間異常(非運行時異常、受檢異常): 如果一個方法內部拋出了一個編譯時間異常對象,那麼方法上就必須要聲明,而且調用者也必須要處理。運行時異常:RuntimeException以及RuntimeException子類 都是屬於運行時異常。編譯時間異常:除了運行時異常就是編譯異常。
如何區分錯誤與異常呢:
1.如果程式出現了不正常的資訊,如果不正常的資訊的類名是以Error結尾的,那麼肯定是一個錯誤。
2.如果是以Exception結尾的,那麼肯定就是一個異常。
class Demo10 { public static void main(String[] args) { int[] arr = null; div(4,0,arr); } public static void div(int a , int b,int[] arr) { int c; c = a/b; //jvm在這句話的時候發現了不正常的情況,那麼就會建立一個對應的異常對象。 System.out.println("數組的長度:"+ arr.length); }}
jvm運行到a/b這個語句的時候,發現b為0,除數為0在我們現實生活中是屬於不正常的情況,jvm一旦發現了這種不正常的情況時候,那麼jvm就會馬上建立一個對應的異常對象,並且會調用這個異常對象的printStackTrace的方法來處理。
異常的處理:
方式一:捕獲處理方式二:拋出處理
捕獲處理
捕獲處理的格式:
try{ 可能發生異常的代碼;}catch(捕獲的異常類型 變數名){ 處理異常的代碼....}
捕獲處理要注意的細節:
1.如果try塊中代碼出了異常經過了處理之後,那麼try-catch塊外面的代碼可以正常執行。
2.如果try塊中出了異常的代碼,那麼在try塊中出現異常代碼後面的代碼是不會執行了。
3.一個try塊後面是可以跟有多個catch塊的,也就是一個try塊可以捕獲多種異常的類型。
4.一個try塊可以捕獲多種異常的類型,但是捕獲的異常類型必須從小到大進行捕獲,否則編譯報錯。
class Demo10 { public static void main(String[] args) { int[] arr = null; div(4,0,arr); } public static void div(int a , int b,int[] arr) { int c = 0; try{ c = a/b; //jvm在這句話的時候發現了不正常的情況,那麼就會建立一個對應的異常對象。 System.out.println("數組的長度:"+ arr.length); }catch(ArithmeticException e){ //處理異常的代碼.... System.out.println("異常處理了...."); System.out.println("toString:"+ e.toString()); }catch(NullPointerException e){ System.out.println("出現了null 指標異常...."); }catch(Exception e){ System.out.println("我是急診室,包治百病!"); } System.out.println("c="+c); }}
捕獲處理的時候是否就是捕獲Exception即可?
錯的,因為我們在現實開發中遇到不同的異常類型的時候,我往往會有不同的處理方式。所以要分開不同的異常類型處理。
拋出處理(throw throws)
拋出處理要注意的細節:
1.如果一個方法的內部拋出了一個異常對象,那麼必須要在方法上聲明拋出。
2.如果調用了一個聲明拋出異常的方法,那麼調用者必須要處理異常。
3.如果一個方法內部拋出了一個異常對象,那麼throw語句後面的代碼都不會再執行了(一個方法遇到了throw關鍵字,該方法也會馬上停止執行的)。
4.在一種情況下,只能拋出一種類型異常對象。
throw與throws兩個關鍵字:
1.throw關鍵字是用於方法內部的,throws是用於方法聲聲明上的。
2.throw關鍵字是用於方法內部拋出一個異常對象的,throws關鍵字是用於在方法聲明上聲明拋出異常類型的。
3.throw關鍵字後面只能有一個異常對象,throws後面一次可以聲明拋出多種類型的異常。
疑問:何時使用拋出處理?何時捕獲處理?原則是如何?
如果你需要通知到調用者,你代碼出了問題,那麼這時候就使用拋出處理.如果代碼是直接與使用者打交道遇到了異常千萬不要再拋,再拋的話,就給了使用者了。這時候就應該使用捕獲處理。
class Demo11 { public static void main(String[] args) { try{ int[] arr = null; div(4,0,arr); //調用了一個聲明拋出異常類型的方法 }catch(Exception e){ System.out.println("出現異常了..."); e.printStackTrace(); } } public static void div(int a, int b,int[] arr) throws Exception,NullPointerException { if(b==0){ throw new Exception(); //拋出一個異常對象... }else if(arr==null){ throw new NullPointerException(); } int c = a/b; System.out.println("c="+c); }}
finally塊;
finally塊的使用前提是必須要存在try塊才能使用。
finally塊的代碼在任何情況下都會執行的,除了jvm退出的情況。
finally非常適合做資源釋放的工作,這樣子可以保證資源檔在任何情況下都會被釋放。
try塊的三種組合方式:
第一種:比較適用於有異常要處理,但是沒有資源要釋放的。
try{ 可能發生異常的代碼}catch(捕獲的異常類型 變數名){ 處理異常的代碼}
第二種:比較適用於既有異常要處理又要釋放資源的代碼。
try{ 可能發生異常的代碼}catch(捕獲的異常類型 變數名){ 處理異常的代碼}finally{ 釋放資源的代碼;}
第三種:比較適用於內部拋出的是運行時異常,並且有資源要被釋放。
try{ 可能發生異常的代碼}finally{ 釋放資源的代碼;}
class Demo5 { public static void main(String[] args) { //System.out.println("Hello World!"); div(4,0); } public static void div(int a, int b) { try{ if(b==0){ System.exit(0);//退出jvm } int c = a/b; System.out.println("c="+ c); }catch(Exception e){ System.out.println("出了除數為0的異常..."); throw e; }finally{ System.out.println("finall塊的代碼執行了.."); } }}
自訂異常類
sun提供了很多的異常類給我們用於描述程式中各種的不正常情況,但是sun給我提供異常類還不足以描述我們現實生活中所有不正常情況,那麼這時候我們就需要自訂異常類。
自訂異常類的步驟:自訂一個類繼承Exception即可。
class NoIpException extends Exception{ public NoIpException(String message){ super(message); //調用了Exception一個參數的建構函式。 }}class Demo2 { public static void main(String[] args) { String ip = "192.168.10.100"; ip = null; try{ feiQ(ip); // 如果調用了一個聲明拋出異常類型的方法,那麼調用者必須要處理。 }catch(NoIpException e){ e.printStackTrace(); System.out.println("馬上插上網線!"); } } public static void feiQ(String ip) throws NoIpException{ if(ip==null){ throw new NoIpException("沒有插網線啊,小白!"); } System.out.println("正常顯示好友名單.."); }}
java包,許可權修飾符java包
包的作用:
1.解決類名重複產生衝突的問題。
2.便於軟體版本的發布。
定義包的格式:
package 包名;
包名命名規範:包名全部小寫。
包語句要注意的事項:
1.package語句必須位於java檔案中中第一個語句。
2.如果一個類加上了包語句,那麼該類的完整類名就是:包名.類名
3.一個java檔案只能有一個包語句。
有了包之後類與類之間的訪問:
解決方案:sum提供導包語句讓我們解決該問題。
導包語句作用:簡化書寫。(誤區:把一個類匯入到記憶體中)
導包語句的格式:
import 包名.類名; (匯入xxx包中某個類)
導包語句要注意的細節:
1.一個java檔案中可以出現多句導包語句。
2."*"是導包語句的萬用字元。可以匹配任何的類名。
3.import aa.*;是不會作用於aa包下面的子包的。
推薦使用:
import 包名.類名; 因為使用*萬用字元會導致結構不清晰。
許可權修飾符
許可權修飾符就是控制被修飾的成員的範圍可見度。
public(公用) protected(受保護) default(預設) private (大到小)同一個類 true true true true同一個包 true true true false 子父類 true true false false不同包 true false false false
注意:在不同包下面只有public與protected可以訪問,而且protected必須是在繼承關係下才能夠訪問。
打jar包:需要使用到jdk的開發工具(jar.exe).
jar的用法:
使用格式:
jar cvf jar檔案的名字 class檔案或者是檔案夾
打jar包要注意的事項:
1.一個程式打完了jar之後必須要在資訊清單檔上指定入口類:格式 Main-Class:包名.類名
2.jar包雙擊運行僅對於圖形化介面的程式起作用,對控制台的程式不起作用。
jar檔案的作用:
1.方便使用者快速運行一個項目。
2.提供工具類以jar包的形式給別人使用。
如果使用jar包裡面的類必須要先設定classpath路徑。
jre = jvm+ 核心類庫
package qq;import javax.swing.*;class Demo9 { public static void main(String[] args) { System.out.println("QQ程式.."); JFrame frame = new JFrame("QQ程式"); frame.setSize(400,500); frame.setVisible(true); //設定視窗可見。 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}
java(異常體系及許可權修飾符)