免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
異常

第一章  異常

1、Throwable類(lèi)是java語(yǔ)言中的所有錯(cuò)誤和異常的基類(lèi)。2、

  java.lang.Throwable:類(lèi)是 Java 語(yǔ)言中所有錯(cuò)誤或異常的超類(lèi)。
    Exception:編譯期異常,進(jìn)行編譯(寫(xiě)代碼)java程序出現(xiàn)的問(wèn)題
      RuntimeException:運(yùn)行期異常,java程序運(yùn)行過(guò)程中出現(xiàn)的問(wèn)題
      異常就相當(dāng)于程序得了一個(gè)小毛病(感冒,發(fā)燒),把異常處理掉,程序可以繼續(xù)執(zhí)行(吃點(diǎn)藥,繼續(xù)革命工作)
    Error:錯(cuò)誤
      錯(cuò)誤就相當(dāng)于程序得了一個(gè)無(wú)法治愈的毛病.必須修改源代碼,程序才能繼續(xù)執(zhí)行

代碼示例:

 1 public class Demo01Exception { 2     public static void main(String[] args) /*throws ParseException*/ { 3         //Exception:編譯期異常,進(jìn)行編譯(寫(xiě)代碼)java程序出現(xiàn)的問(wèn)題 4         /*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//用來(lái)格式化日期 5         Date date = null; 6         try { 7             date = sdf.parse("1999-0909");//把字符串格式的日期,解析為Date格式的日期 8         } catch (ParseException e) { 9             e.printStackTrace();10         }11         System.out.println(date);*/12 13         //RuntimeException:運(yùn)行期異常,java程序運(yùn)行過(guò)程中出現(xiàn)的問(wèn)題14         /*int[] arr = {1,2,3};15         //System.out.println(arr[0]);16         try {17             //可能會(huì)出現(xiàn)異常的代碼18             System.out.println(arr[3]);19         }catch(Exception e){20             //異常的處理邏輯21             System.out.println(e);22         }*/23 24         /*25             Error:錯(cuò)誤26             OutOfMemoryError: Java heap space27             內(nèi)存溢出的錯(cuò)誤,創(chuàng)建的數(shù)組太大了,超出了給JVM分配的內(nèi)存28          */29         //int[] arr = new int[1024*1024*1024];30         //必須修改代碼,創(chuàng)建的數(shù)組小一點(diǎn)31         int[] arr = new int[1024*1024];32         System.out.println("后續(xù)代碼");33     }

3、異常的產(chǎn)生過(guò)程解析

第二章  異常的處理

  Java異常處理的五個(gè)關(guān)鍵字:try、catch、finally、throw、throws

 2.1 throw關(guān)鍵字

  作用:
    可以使用throw關(guān)鍵字在指定的方法中拋出指定的異常
  使用格式:
    throw new xxxException("異常產(chǎn)生的原因");
  注意:
    1.throw關(guān)鍵字必須寫(xiě)在方法的內(nèi)部
    2.throw關(guān)鍵字后邊new的對(duì)象必須是Exception或者Exception的子類(lèi)對(duì)象
    3.throw關(guān)鍵字拋出指定的異常對(duì)象,我們就必須處理這個(gè)異常對(duì)象
        throw關(guān)鍵字后邊創(chuàng)建的是RuntimeException或者是 RuntimeException的子類(lèi)對(duì)象,我們可以不處理,默認(rèn)交給JVM處理(打印異常對(duì)象,中斷程序)
        throw關(guān)鍵字后邊創(chuàng)建的是編譯異常(寫(xiě)代碼的時(shí)候報(bào)錯(cuò)),我們就必須處理這個(gè)異常,要么throws,要么try...catch

代碼示例:

 1 public class Demo03Throw { 2     public static void main(String[] args) { 3         //int[] arr = null; 4         int[] arr = new int[3]; 5         int e = getElement(arr,3); 6         System.out.println(e); 7     } 8     /* 9         定義一個(gè)方法,獲取數(shù)組指定索引處的元素10         參數(shù):11             int[] arr12             int index13         以后(工作中)我們首先必須對(duì)方法傳遞過(guò)來(lái)的參數(shù)進(jìn)行合法性校驗(yàn)14         如果參數(shù)不合法,那么我們就必須使用拋出異常的方式,告知方法的調(diào)用者,傳遞的參數(shù)有問(wèn)題15         注意:16             NullPointerException是一個(gè)運(yùn)行期異常,我們不用處理,默認(rèn)交給JVM處理17             ArrayIndexOutOfBoundsException是一個(gè)運(yùn)行期異常,我們不用處理,默認(rèn)交給JVM處理18      */19     public static int getElement(int[] arr,int index){20         /*21             我們可以對(duì)傳遞過(guò)來(lái)的參數(shù)數(shù)組,進(jìn)行合法性校驗(yàn)22             如果數(shù)組arr的值是null23             那么我們就拋出空指針異常,告知方法的調(diào)用者"傳遞的數(shù)組的值是null"24          */25         if(arr == null){26             throw new NullPointerException("傳遞的數(shù)組的值是null");27         }28 29         /*30             我們可以對(duì)傳遞過(guò)來(lái)的參數(shù)index進(jìn)行合法性校驗(yàn)31             如果index的范圍不在數(shù)組的索引范圍內(nèi)32             那么我們就拋出數(shù)組索引越界異常,告知方法的調(diào)用者"傳遞的索引超出了數(shù)組的使用范圍"33          */34         if(index<0 || index>arr.length-1){35             throw new ArrayIndexOutOfBoundsException("傳遞的索引超出了數(shù)組的使用范圍");36         }37 38         int ele = arr[index];39         return ele;40     }41 }

2.2 Objects非空判斷

  還記得我們學(xué)習(xí)過(guò)一個(gè)類(lèi)Objects嗎,曾經(jīng)提到過(guò)它由一些靜態(tài)的實(shí)用方法組成,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),那么在它的源碼中,對(duì)對(duì)象為null的值進(jìn)行了拋出異常操作。

  Obects類(lèi)中的靜態(tài)方法
  public static <T> T requireNonNull(T obj):查看指定引用對(duì)象不是null。
  源碼:

public static <T> T requireNonNull(T obj) {    if (obj == null)        throw new NullPointerException();    return obj;}

代碼示例:

 1 public class Demo04Objects { 2     public static void main(String[] args) { 3         method(null); 4     } 5  6     public static void method(Object obj){ 7         //對(duì)傳遞過(guò)來(lái)的參數(shù)進(jìn)行合法性判斷,判斷是否為null 8         /*if(obj == null){ 9             throw new NullPointerException("傳遞的對(duì)象的值是null");10         }*/11 12         //Objects.requireNonNull(obj);13         Objects.requireNonNull(obj,"傳遞的對(duì)象的值是null");14     }15 }

2.3 聲明異常throws

  聲明異常:將問(wèn)題標(biāo)識(shí)出來(lái),報(bào)告給調(diào)用者。如果方法內(nèi)通過(guò)throw拋出了編譯時(shí)異常,而沒(méi)有捕獲處理(稍后講解該方式),那么必須通過(guò)throws進(jìn)行聲明,讓調(diào)用者去處理。
  關(guān)鍵字throws運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來(lái)處理異常(拋出異常).

  聲明異常格式:

修飾符 返回值類(lèi)型 方法名(參數(shù)) throws 異常類(lèi)名1,異常類(lèi)名2…{ }

  throws關(guān)鍵字:處理異常的第一種方式,交給別人處理

  作用:

    當(dāng)方法內(nèi)部拋出異常對(duì)象的時(shí)候,那么我們就必須處理這個(gè)異常對(duì)象

    可以使用throws關(guān)鍵字處理異常對(duì)象,會(huì)把異常對(duì)象聲明拋出給方法的調(diào)用者處理(自己不處理,給別人處理),最終交給JVM處理 --> 中斷處理

  使用格式:在方法聲明時(shí)使用

    修飾符    返回值類(lèi)型    方法名(參數(shù)列表) throws    AAAException,BBBException...{

        throws    new    AAAException("產(chǎn)生原因");

        throws    new    BBBException("產(chǎn)生原因");

    }

  注意:

    1、throws關(guān)鍵字必須寫(xiě)在方法聲明處

    2、throws關(guān)鍵字后邊聲明的異常必須是Exception或是Exception的子類(lèi)

    3、方法內(nèi)部如果拋出了多個(gè)異常對(duì)象,那么throws后邊也必須聲明多個(gè)異常

    4、調(diào)用了一個(gè)聲明拋出異常的方法,我們就必須處理聲明的異常

        要么繼續(xù)使用throws聲明拋出,交給方法的調(diào)用者處理,最終交給JVM

        要么try...catch自己處理異常

代碼示例:

 1 public class Demo05Throws { 2  3     /* 4         FileNotFoundException extends IOException extends Exception 5         如果拋出的多個(gè)異常對(duì)象有子父類(lèi)關(guān)系,那么直接聲明父類(lèi)即可 6      */ 7     //public static void main(String[] args) throws FileNotFoundException,IOException { 8     //public static void main(String[] args) throws IOException { 9     public static void main(String[] args) throws Exception {10         //readFile("c:\\a.txt");11         //readFile("d:\\a.txt");12         readFile("d:\\a.tx");13     }14 15     /*16         定義一個(gè)方法,對(duì)傳遞的文件路徑進(jìn)行合法性判斷17         如果路徑不是"c:\\a.txt",那么我們就拋出文件找不到異常對(duì)象,告知方法的調(diào)用者18         注意:19 20      */21 22     public static void readFile(String fileName) throws FileNotFoundException,IOException {23         if (!fileName.equals("c:\\a.txt")){24             throw new FileNotFoundException("傳遞的路徑不是c:\\a.txt");25         }26 27         /*28             如果傳遞的路徑,不是.txt結(jié)尾29             那么我們就拋出IO異常對(duì)象,告知方法的調(diào)用者,文件的后綴名不對(duì)30          */31 32         if (!fileName.endsWith(".txt")){33             throw new IOException("文件的后綴名不對(duì)");34         }35         System.out.printf("路徑?jīng)]有問(wèn)題,讀取文件");36     }37 }

2.4 捕獲異常try…catch

  如果異常出現(xiàn)的話(huà),會(huì)立刻終止程序,所以我們得處理異常:
    1. 該方法不處理,而是聲明拋出,由該方法的調(diào)用者來(lái)處理(throws)。
    2. 在方法中使用try-catch的語(yǔ)句塊來(lái)處理異常。
  try-catch的方式就是捕獲異常。

    • 捕獲異常:Java中對(duì)異常有針對(duì)性的語(yǔ)句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理。

  try...catch:異常處理的第二種方式,自己處理異常
  格式:
    try{
      可能產(chǎn)生異常的代碼
    }catch(定義一個(gè)異常的變量,用來(lái)接收try中拋出的異常對(duì)象){
      異常的處理邏輯,異常異常對(duì)象之后,怎么處理異常對(duì)象
      一般在工作中,會(huì)把異常的信息記錄到一個(gè)日志中
    }
    ...
    catch(異常類(lèi)名 變量名){

    }
  注意:
    1.try中可能會(huì)拋出多個(gè)異常對(duì)象,那么就可以使用多個(gè)catch來(lái)處理這些異常對(duì)象
    2.如果try中產(chǎn)生了異常,那么就會(huì)執(zhí)行catch中的異常處理邏輯,執(zhí)行完畢catch中的處理邏輯,繼續(xù)執(zhí)行try...catch之后的代碼
       如果try中沒(méi)有產(chǎn)生異常,那么就不會(huì)執(zhí)行catch中異常的處理邏輯,執(zhí)行完try中的代碼,繼續(xù)執(zhí)行try...catch之后的代碼

  Throwable類(lèi)中定義了3個(gè)異常處理的方法
    String getMessage() 返回此 throwable 的簡(jiǎn)短描述。
    String toString() 返回此 throwable 的詳細(xì)消息字符串。
    void printStackTrace() JVM打印異常對(duì)象,默認(rèn)此方法,打印的異常信息是最全面的

  包含了異常的類(lèi)型,異常的原因,還包括異常出現(xiàn)的位置,在開(kāi)發(fā)和調(diào)試階段,都得使用printStackTrace。

代碼示例:

 1 public class Demo01TryCatch { 2     public static void main(String[] args) { 3         try{ 4             //可能產(chǎn)生異常的代碼 5             readFile("d:\\a.tx"); 6             System.out.println("資源釋放"); 7         }catch (IOException e){//try中拋出什么異常對(duì)象,catch就定義什么異常變量,用來(lái)接收這個(gè)異常對(duì)象 8             //異常的處理邏輯,異常異常對(duì)象之后,怎么處理異常對(duì)象 9             //System.out.println("catch - 傳遞的文件后綴不是.txt");10 11             /*12                 Throwable類(lèi)中定義了3個(gè)異常處理的方法13                  String getMessage() 返回此 throwable 的簡(jiǎn)短描述。14                  String toString() 返回此 throwable 的詳細(xì)消息字符串。15                  void printStackTrace()  JVM打印異常對(duì)象,默認(rèn)此方法,打印的異常信息是最全面的16              */17             //System.out.println(e.getMessage());//文件的后綴名不對(duì)18             //System.out.println(e.toString());//重寫(xiě)Object類(lèi)的toString java.io.IOException: 文件的后綴名不對(duì)19             //System.out.println(e);//java.io.IOException: 文件的后綴名不對(duì)20 21             /*22                 java.io.IOException: 文件的后綴名不對(duì)23                     at com.itheima.demo02.Exception.Demo01TryCatch.readFile(Demo01TryCatch.java:55)24                     at com.itheima.demo02.Exception.Demo01TryCatch.main(Demo01TryCatch.java:27)25              */26             e.printStackTrace();27         }28         System.out.println("后續(xù)代碼");29     }30 31     /*32        如果傳遞的路徑,不是.txt結(jié)尾33        那么我們就拋出IO異常對(duì)象,告知方法的調(diào)用者,文件的后綴名不對(duì)34 35     */36     public static void readFile(String fileName) throws IOException {37 38         if(!fileName.endsWith(".txt")){39             throw new IOException("文件的后綴名不對(duì)");40         }41 42         System.out.println("路徑?jīng)]有問(wèn)題,讀取文件");43     }44 }

2.4 finally 代碼塊

  finally:有一些特定的代碼無(wú)論異常是否發(fā)生,都需要執(zhí)行。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語(yǔ)句執(zhí)行不到。而finally就是解決這個(gè)問(wèn)題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。
  什么時(shí)候的代碼必須最終執(zhí)行?
    當(dāng)我們?cè)趖ry語(yǔ)句塊中打開(kāi)了一些物理資源(磁盤(pán)文件/網(wǎng)絡(luò)連接/數(shù)據(jù)庫(kù)連接等),我們都得在使用完之后,最終關(guān)閉打開(kāi)的資源。
  finally的語(yǔ)法:
    try...catch....finally:自身需要處理異常,最終還得關(guān)閉資源。

  finally代碼塊
    格式:
      try{
        可能產(chǎn)生異常的代碼
      }catch(定義一個(gè)異常的變量,用來(lái)接收try中拋出的異常對(duì)象){
        異常的處理邏輯,異常異常對(duì)象之后,怎么處理異常對(duì)象
        一般在工作中,會(huì)把異常的信息記錄到一個(gè)日志中
      }
      ...
      catch(異常類(lèi)名 變量名){

      }finally{
        無(wú)論是否出現(xiàn)異常都會(huì)執(zhí)行
      }
  注意:
    1.finally不能單獨(dú)使用,必須和try一起使用
    2.finally一般用于資源釋放(資源回收),無(wú)論程序是否出現(xiàn)異常,最后都要資源釋放(IO)

    3.當(dāng)只有在try或者catch中調(diào)用退出JVM的相關(guān)方法,此時(shí)finally才不會(huì)執(zhí)行,否則finally永遠(yuǎn)會(huì)執(zhí)行。

代碼示例:

 1 public class Demo02TryCatchFinally { 2     public static void main(String[] args) { 3         try { 4             //可能會(huì)產(chǎn)生異常的代碼 5             readFile("c:\\a.tx"); 6         } catch (IOException e) { 7             //異常的處理邏輯 8             e.printStackTrace(); 9         } finally {10             //無(wú)論是否出現(xiàn)異常,都會(huì)執(zhí)行11             System.out.println("資源釋放");12         }13     }14 15     /*16        如果傳遞的路徑,不是.txt結(jié)尾17        那么我們就拋出IO異常對(duì)象,告知方法的調(diào)用者,文件的后綴名不對(duì)18 19     */20     public static void readFile(String fileName) throws IOException {21 22         if(!fileName.endsWith(".txt")){23             throw new IOException("文件的后綴名不對(duì)");24         }25 26         System.out.println("路徑?jīng)]有問(wèn)題,讀取文件");27     }28 }

2.5 異常注意事項(xiàng)

  多個(gè)異常使用捕獲又該如何處理呢?
    1. 多個(gè)異常分別處理。
    2. 多個(gè)異常一次捕獲,多次處理。
    3. 多個(gè)異常一次捕獲一次處理。

  一般我們是使用一次捕獲多次處理方式,格式如下:

try{    編寫(xiě)可能會(huì)出現(xiàn)異常的代碼}catch(異常類(lèi)型A e){ 當(dāng)try中出現(xiàn)A類(lèi)型異常,就用該catch來(lái)捕獲.    處理異常的代碼    //記錄日志/打印異常信息/繼續(xù)拋出異常}catch(異常類(lèi)型B e){ 當(dāng)try中出現(xiàn)B類(lèi)型異常,就用該catch來(lái)捕獲.    處理異常的代碼    //記錄日志/打印異常信息/繼續(xù)拋出異常}

注意:這種異常處理方式,要求多個(gè)catch中的異常不能相同,并且若catch中的多個(gè)異常之間有子父類(lèi)異常的關(guān)系,那么子類(lèi)異常要求在上面的catch處理,父類(lèi)異常在下面的catch處理。

  • 運(yùn)行時(shí)異常被拋出可以不處理。即不捕獲也不聲明拋出。

  • 如果finally有return語(yǔ)句,永遠(yuǎn)返回finally中的結(jié)果,避免該情況。

  • 如果父類(lèi)拋出了多個(gè)異常,子類(lèi)重寫(xiě)父類(lèi)方法時(shí),拋出和父類(lèi)相同的異?;蛘呤歉割?lèi)異常的子類(lèi)或者不拋出異常。

  • 父類(lèi)方法沒(méi)有拋出異常,子類(lèi)重寫(xiě)父類(lèi)該方法時(shí)也不可拋出異常。此時(shí)子類(lèi)產(chǎn)生該異常,只能捕獲處理,不能聲明拋出。

代碼示例:

 1 public class Demo01Exception { 2     public static void main(String[] args) { 3         /* 4             多個(gè)異常使用捕獲又該如何處理呢? 5             1. 多個(gè)異常分別處理。 6             2. 多個(gè)異常一次捕獲,多次處理。 7             3. 多個(gè)異常一次捕獲一次處理。 8          */ 9 10         //1. 多個(gè)異常分別處理。11        /* try {12             int[] arr = {1,2,3};13             System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 314         }catch (ArrayIndexOutOfBoundsException e){15             System.out.println(e);16         }17 18         try{19             List<Integer> list = List.of(1, 2, 3);20             System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 321         }catch (IndexOutOfBoundsException e){22             System.out.println(e);23         }*/24 25         //2. 多個(gè)異常一次捕獲,多次處理。26         /*try {27             int[] arr = {1,2,3};28             //System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 329             List<Integer> list = List.of(1, 2, 3);30             System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 331         }catch (ArrayIndexOutOfBoundsException e){32             System.out.println(e);33         }catch (IndexOutOfBoundsException e){34             System.out.println(e);35         }*/36 37         /*38             一個(gè)try多個(gè)catch注意事項(xiàng):39                 catch里邊定義的異常變量,如果有子父類(lèi)關(guān)系,那么子類(lèi)的異常變量必須寫(xiě)在上邊,否則就會(huì)報(bào)錯(cuò)40                 ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException41          */42         /*try {43             int[] arr = {1,2,3};44             //System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 345             List<Integer> list = List.of(1, 2, 3);46             System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 347         }catch (IndexOutOfBoundsException e){48             System.out.println(e);49         }catch (ArrayIndexOutOfBoundsException e){50             System.out.println(e);51         }*/52 53         //3. 多個(gè)異常一次捕獲一次處理。54         /*try {55             int[] arr = {1,2,3};56             //System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 357             List<Integer> list = List.of(1, 2, 3);58             System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 359         }catch (Exception e){60             System.out.println(e);61         }*/62 63         //運(yùn)行時(shí)異常被拋出可以不處理。即不捕獲也不聲明拋出。64         //默認(rèn)給虛擬機(jī)處理,終止程序,什么時(shí)候不拋出運(yùn)行時(shí)異常了,在來(lái)繼續(xù)執(zhí)行程序65         int[] arr = {1,2,3};66         System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 367         List<Integer> list = List.of(1, 2, 3);68         System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 369 70         System.out.println("后續(xù)代碼!");71     }72 }

代碼示例:

 1 /* 2     如果finally有return語(yǔ)句,永遠(yuǎn)返回finally中的結(jié)果,避免該情況. 3  */ 4 public class Demo02Exception { 5     public static void main(String[] args) { 6         int a = getA(); 7         System.out.println(a); 8     } 9 10     //定義一個(gè)方法,返回變量a的值11     public static int getA(){12         int a = 10;13         try{14             return a;15         }catch (Exception e){16             System.out.println(e);17         }finally {18             //一定會(huì)執(zhí)行的代碼19             a = 100;20             return a;21         }22 23     }24 }

說(shuō)明:調(diào)用方法后,返回值是100。為了避免永遠(yuǎn)返回finally中的結(jié)果,finally代碼塊中盡量不要使用return語(yǔ)句。

  子父類(lèi)的異常:
    - 如果父類(lèi)拋出了多個(gè)異常,子類(lèi)重寫(xiě)父類(lèi)方法時(shí),拋出和父類(lèi)相同的異?;蛘呤歉割?lèi)異常的子類(lèi)或者不拋出異常。
    - 父類(lèi)方法沒(méi)有拋出異常,子類(lèi)重寫(xiě)父類(lèi)該方法時(shí)也不可拋出異常。此時(shí)子類(lèi)產(chǎn)生該異常,只能捕獲處理,不能聲明拋出
  注意:
    父類(lèi)異常時(shí)什么樣,子類(lèi)異常就什么樣

代碼示例:

 1 /* 2     子父類(lèi)的異常: 3         - 如果父類(lèi)拋出了多個(gè)異常,子類(lèi)重寫(xiě)父類(lèi)方法時(shí),拋出和父類(lèi)相同的異常或者是父類(lèi)異常的子類(lèi)或者不拋出異常。 4         - 父類(lèi)方法沒(méi)有拋出異常,子類(lèi)重寫(xiě)父類(lèi)該方法時(shí)也不可拋出異常。此時(shí)子類(lèi)產(chǎn)生該異常,只能捕獲處理,不能聲明拋出 5     注意: 6         父類(lèi)異常時(shí)什么樣,子類(lèi)異常就什么樣 7  */ 8 public class Fu { 9     public void show01() throws NullPointerException,ClassCastException{}10     public void show02() throws IndexOutOfBoundsException{}11     public void show03() throws IndexOutOfBoundsException{}12     public void show04() throws Exception {}13 }14 15 class Zi extends Fu{16     //子類(lèi)重寫(xiě)父類(lèi)方法時(shí),拋出和父類(lèi)相同的異常17     public void show01() throws NullPointerException,ClassCastException{}18     //子類(lèi)重寫(xiě)父類(lèi)方法時(shí),拋出父類(lèi)異常的子類(lèi)19     public void show02() throws ArrayIndexOutOfBoundsException{}20     //子類(lèi)重寫(xiě)父類(lèi)方法時(shí),不拋出異常21     public void show03() {}22 23     /*24         父類(lèi)方法沒(méi)有拋出異常,子類(lèi)重寫(xiě)父類(lèi)該方法時(shí)也不可拋出異常。25 26      */27     //public void show04() throws Exception{}28 29     //此時(shí)子類(lèi)產(chǎn)生該異常,只能捕獲處理,不能聲明拋出30     public void show04()  {31         try {32             throw  new Exception("編譯期異常");33         } catch (Exception e) {34             e.printStackTrace();35         }36     }37 }

第三章 自定義異常

3.1 概述

  為什么需要自定義異常類(lèi):
    我們說(shuō)了Java中不同的異常類(lèi),分別表示著某一種具體的異常情況,那么在開(kāi)發(fā)中總是有些異常情況是SUN沒(méi)有定義好的,此時(shí)我們根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類(lèi)。例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題等等。
  在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實(shí)際開(kāi)發(fā)中也會(huì)出現(xiàn)很多異常,這些異常很可能在JDK中沒(méi)有定義過(guò),例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題.那么能不能自己定義異常呢?
  什么是自定義異常類(lèi):
    在開(kāi)發(fā)中根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類(lèi).
    自定義一個(gè)業(yè)務(wù)邏輯異常: RegisterException。一個(gè)注冊(cè)異常類(lèi)。
  異常類(lèi)如何定義:
    1. 自定義一個(gè)編譯期異常: 自定義類(lèi) 并繼承于java.lang.Exception 。
    2. 自定義一個(gè)運(yùn)行時(shí)期的異常類(lèi):自定義類(lèi) 并繼承于java.lang.RuntimeException 。

  自定義異常類(lèi):
    java提供的異常類(lèi),不夠我們使用,需要自己定義一些異常類(lèi)
  格式:
    public class XXXExcepiton extends Exception | RuntimeException{
      添加一個(gè)空參數(shù)的構(gòu)造方法
      添加一個(gè)帶異常信息的構(gòu)造方法
    }
  注意:
    1.自定義異常類(lèi)一般都是以Exception結(jié)尾,說(shuō)明該類(lèi)是一個(gè)異常類(lèi)
    2.自定義異常類(lèi),必須的繼承Exception或者RuntimeException
      繼承Exception:那么自定義的異常類(lèi)就是一個(gè)編譯期異常,如果方法內(nèi)部拋出了編譯期異常,就必須處理這個(gè)異常,要么throws,要么try...catch
      繼承RuntimeException:那么自定義的異常類(lèi)就是一個(gè)運(yùn)行期異常,無(wú)需處理,交給虛擬機(jī)處理(中斷處理)

代碼示例:

 1 /* 2     自定義異常類(lèi): 3         java提供的異常類(lèi),不夠我們使用,需要自己定義一些異常類(lèi) 4     格式: 5         public class XXXExcepiton extends Exception | RuntimeException{ 6             添加一個(gè)空參數(shù)的構(gòu)造方法 7             添加一個(gè)帶異常信息的構(gòu)造方法 8         } 9      注意:10         1.自定義異常類(lèi)一般都是以Exception結(jié)尾,說(shuō)明該類(lèi)是一個(gè)異常類(lèi)11         2.自定義異常類(lèi),必須的繼承Exception或者RuntimeException12             繼承Exception:那么自定義的異常類(lèi)就是一個(gè)編譯期異常,如果方法內(nèi)部拋出了編譯期異常,就必須處理這個(gè)異常,要么throws,要么try...catch13             繼承RuntimeException:那么自定義的異常類(lèi)就是一個(gè)運(yùn)行期異常,無(wú)需處理,交給虛擬機(jī)處理(中斷處理)14  */15 public class RegisterException extends /*Exception*/ RuntimeException{16     //添加一個(gè)空參數(shù)的構(gòu)造方法17     public RegisterException(){18         super();19     }20 21     /*22         添加一個(gè)帶異常信息的構(gòu)造方法23         查看源碼發(fā)現(xiàn),所有的異常類(lèi)都會(huì)有一個(gè)帶異常信息的構(gòu)造方法,方法內(nèi)部會(huì)調(diào)用父類(lèi)帶異常信息的構(gòu)造方法,讓父類(lèi)來(lái)處理這個(gè)異常信息24      */25     public RegisterException(String message){26         super(message);27     }28 }

3.2 自定義異常的練習(xí)

要求:我們模擬注冊(cè)操作,如果用戶(hù)名已存在,則拋出異常并提示:親,該用戶(hù)名已經(jīng)被注冊(cè)。

Demo01RegisterException.java:

 1 import java.util.Scanner; 2  3 /* 4     要求:我們模擬注冊(cè)操作,如果用戶(hù)名已存在,則拋出異常并提示:親,該用戶(hù)名已經(jīng)被注冊(cè)。 5  6     分析: 7         1.使用數(shù)組保存已經(jīng)注冊(cè)過(guò)的用戶(hù)名(數(shù)據(jù)庫(kù)) 8         2.使用Scanner獲取用戶(hù)輸入的注冊(cè)的用戶(hù)名(前端,頁(yè)面) 9         3.定義一個(gè)方法,對(duì)用戶(hù)輸入的中注冊(cè)的用戶(hù)名進(jìn)行判斷10             遍歷存儲(chǔ)已經(jīng)注冊(cè)過(guò)用戶(hù)名的數(shù)組,獲取每一個(gè)用戶(hù)名11             使用獲取到的用戶(hù)名和用戶(hù)輸入的用戶(hù)名比較12                 true:13                     用戶(hù)名已經(jīng)存在,拋出RegisterException異常,告知用戶(hù)"親,該用戶(hù)名已經(jīng)被注冊(cè)";14                 false:15                     繼續(xù)遍歷比較16             如果循環(huán)結(jié)束了,還沒(méi)有找到重復(fù)的用戶(hù)名,提示用戶(hù)"恭喜您,注冊(cè)成功!";17  */18 public class Demo01RegisterException {19     // 1.使用數(shù)組保存已經(jīng)注冊(cè)過(guò)的用戶(hù)名(數(shù)據(jù)庫(kù))20     static String[] usernames = {"張三","李四","王五"};21 22     public static void main(String[] args) /*throws RegisterException*/ {23         //2.使用Scanner獲取用戶(hù)輸入的注冊(cè)的用戶(hù)名(前端,頁(yè)面)24         Scanner sc = new Scanner(System.in);25         System.out.println("請(qǐng)輸入您要注冊(cè)的用戶(hù)名:");26         String username = sc.next();27         checkUsername(username);28 29     }30 31     //3.定義一個(gè)方法,對(duì)用戶(hù)輸入的中注冊(cè)的用戶(hù)名進(jìn)行判斷32     public static void checkUsername(String username) /*throws RegisterException*/ {33         //遍歷存儲(chǔ)已經(jīng)注冊(cè)過(guò)用戶(hù)名的數(shù)組,獲取每一個(gè)用戶(hù)名34         for (String name : usernames) {35             //使用獲取到的用戶(hù)名和用戶(hù)輸入的用戶(hù)名比較36             if(name.equals(username)){37                 //true:用戶(hù)名已經(jīng)存在,拋出RegisterException異常,告知用戶(hù)"親,該用戶(hù)名已經(jīng)被注冊(cè)";38                 try {39                     throw new RegisterException("親,該用戶(hù)名已經(jīng)被注冊(cè)");40                 } catch (RegisterException e) {41                     e.printStackTrace();42                     return; //結(jié)束方法(否則會(huì)執(zhí)行下面的System.out.println("恭喜您,注冊(cè)成功!");語(yǔ)句)43                 }44             }45         }46         //如果循環(huán)結(jié)束了,還沒(méi)有找到重復(fù)的用戶(hù)名,提示用戶(hù)"恭喜您,注冊(cè)成功!";47         System.out.println("恭喜您,注冊(cè)成功!");48     }49 }

Demo02RegisterException.java:

 1 import java.util.Scanner; 2  3 /* 4     要求:我們模擬注冊(cè)操作,如果用戶(hù)名已存在,則拋出異常并提示:親,該用戶(hù)名已經(jīng)被注冊(cè)。 5  6     分析: 7         1.使用數(shù)組保存已經(jīng)注冊(cè)過(guò)的用戶(hù)名(數(shù)據(jù)庫(kù)) 8         2.使用Scanner獲取用戶(hù)輸入的注冊(cè)的用戶(hù)名(前端,頁(yè)面) 9         3.定義一個(gè)方法,對(duì)用戶(hù)輸入的中注冊(cè)的用戶(hù)名進(jìn)行判斷10             遍歷存儲(chǔ)已經(jīng)注冊(cè)過(guò)用戶(hù)名的數(shù)組,獲取每一個(gè)用戶(hù)名11             使用獲取到的用戶(hù)名和用戶(hù)輸入的用戶(hù)名比較12                 true:13                     用戶(hù)名已經(jīng)存在,拋出RegisterException異常,告知用戶(hù)"親,該用戶(hù)名已經(jīng)被注冊(cè)";14                 false:15                     繼續(xù)遍歷比較16             如果循環(huán)結(jié)束了,還沒(méi)有找到重復(fù)的用戶(hù)名,提示用戶(hù)"恭喜您,注冊(cè)成功!";17  */18 public class Demo02RegisterException {19     // 1.使用數(shù)組保存已經(jīng)注冊(cè)過(guò)的用戶(hù)名(數(shù)據(jù)庫(kù))20     static String[] usernames = {"張三","李四","王五"};21 22     public static void main(String[] args) {23         //2.使用Scanner獲取用戶(hù)輸入的注冊(cè)的用戶(hù)名(前端,頁(yè)面)24         Scanner sc = new Scanner(System.in);25         System.out.println("請(qǐng)輸入您要注冊(cè)的用戶(hù)名:");26         String username = sc.next();27         checkUsername(username);28 29     }30 31     //3.定義一個(gè)方法,對(duì)用戶(hù)輸入的中注冊(cè)的用戶(hù)名進(jìn)行判斷32     public static void checkUsername(String username)  {33         //遍歷存儲(chǔ)已經(jīng)注冊(cè)過(guò)用戶(hù)名的數(shù)組,獲取每一個(gè)用戶(hù)名34         for (String name : usernames) {35             //使用獲取到的用戶(hù)名和用戶(hù)輸入的用戶(hù)名比較36             if(name.equals(username)){37                 //true:用戶(hù)名已經(jīng)存在,拋出RegisterException異常,告知用戶(hù)"親,該用戶(hù)名已經(jīng)被注冊(cè)";38                 throw new RegisterException("親,該用戶(hù)名已經(jīng)被注冊(cè)");//拋出運(yùn)行期異常,無(wú)需處理,交給JVM處理,中斷處理39             }40         }41 42         //如果循環(huán)結(jié)束了,還沒(méi)有找到重復(fù)的用戶(hù)名,提示用戶(hù)"恭喜您,注冊(cè)成功!";43         System.out.println("恭喜您,注冊(cè)成功!");44     }45 }
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
詳解Java中異常處理機(jī)制
異常概述
好程序員Java教程系列之異常定義
JAVA之旅(十一)
任務(wù)6 系統(tǒng)異常處理
黑馬程序員
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服