Throwable -拋出異常類與自定義異常類


/*
    自定義異常類
        java提供的異常類,不夠我們使用,需要自己定義一些異常類
     格式:
        public class XXXException extends Exception/runtimeException{
            添加一個空參數的構造方法
            添加一個帶異常信息的構造方法
        }
      注:
        1.自定義異常類一般是Exception結尾,說明該類是一個異常類
        2.必須繼承Exception/RuntimeException
 */
public class RegisterException extends Exception {
    //添加一個帶空參數的異常
    public RegisterException() {
    }

    //查看異常源碼可知,可以讓父類的構造方法來解決異常信息
    public RegisterException(String message) {
        super(message);
    }

}
 1 import java.util.Scanner;
 2 
 3 /**
 4  * 利用異常,模擬注冊功能
 5  */
 6 
 7 public class IsRegister {
 8     //1.數組保存已經注冊的用戶名(數據庫)
 9     static String[] usename = {"趙", "王", "孫"};
10 
11     public static void main(String[] args) /*throws RegisterException*/ {
12         //2.一般從前端獲取數據源
13         Scanner sc = new Scanner(System.in);
14         System.out.println("請輸入用戶名: ");
15         String name = sc.nextLine();
16         checkUsename(name);
17 
18     }
19     //3.定義一個方法對用戶輸入的數據進行判斷
20     public static void checkUsename(String name) /*throws RegisterException*/ {
21         for (String usename : usename) {
22             if(usename.equals(name)){
23                 try {
24                     throw new RegisterException("用戶已注冊"); //運行期異常,可以不用throws和try catch
25                 } catch (RegisterException e) {
26                     e.printStackTrace();
27                     return;//結束
28                 }
29             }
30         }
31         //注冊成功
32         System.out.println("注冊成功");
33     }
34 }
/*
//Throwable所有異常的超類
      Exception -編譯異常,可以throws或者try{}catch{}  -子類
      RuntimeException -運行異常,可以不處理,讓JVM處理
      Error -無法處理,必須修改源代碼,內存溢出,系統崩潰 -子類
  異常處理過程:方法里面異常,查看有沒有異常處理邏輯,若沒有
               ——把內容,原因,位置報告JVM——找到方法的調用者(main)
               ——查看有沒有異常處理邏輯,若沒有——返回給JVM,JVM控制台打印,並且中斷程序

//運行時異常
  throw關鍵字
        作用:可以使用throw關鍵字在指定的方法中拋出指定的異常
             格式:throw new xxxException("異常產生的原因")
             注:1.throw關鍵字必須在方法的內部
                2.throw關鍵字new的必須是Exception或其子類對象
                3.throw關鍵字拋出指定的異常對象,我們必須處理這個對象
                    1.throw關鍵字后邊創建的是RuntimeException或其子類對象,可以交給JVM(打印異常+中斷程序)
                    2.throw關鍵字后邊創建的是編譯異常(寫代碼的時候),要么throws,要么try catch
工作中,必須對對方傳遞過來的方法進行合法化校驗,不合法,則拋出異常的方式給到調用者

//編譯異常
  throws關鍵字:異常處理的第一種方式,交給被人處理
        作用:
            當方法的內部拋出異常對象的時候,那么我們就必須處理這個異常對象
            throws將異常對象聲明(內容,原因,位置)給調用者,自己不處理,最終會交付給JVM
        格式:
            修飾符 返回值類型 方法名(參數列表)throws XXXException,XXX,XXX{
                throw new XXXException("異常的原因")
            }
        注意:throws 后面的異常聲明必須是Exception或其子類
              方法內部如果有多個異常對象,throws必須聲明多個
              如果異常對象有子父類對象,直接聲明父類異常即可
  此外,如一旦聲明拋出異常的方法,就必須處理該異常,要么繼續在調用對象throws聲明異常,最后交給方法調用者最后交給JVM,中斷
  要么try...catch自己處理(一般這種比較好)不中斷

  try catch:異常處理的第二種方式,自己處理
        格式:try{
            可能異常的代碼
        }catch(定義一個異常變量接受try中異常變量){
            異常處理邏輯,工作中會把信息記錄進日志
        }
        ...
          catch(定義一個異常變量接受try中異常變量){
            異常處理邏輯,工作中會把信息記錄進日志
        }
        注:try中可能有對個異常對象,所以需要多個catch來處理
            如果try中產生異常,就會執行catch的異常處理邏輯,繼續執行之后的代碼
            如果catch里的異常類有父子類關系,子類應該寫在上邊(二義性),Exception所有的異常類


  finally
        格式:try{
            可能異常的代碼
        }catch(定義一個異常變量接受try中異常變量){
            異常處理邏輯,工作中會把信息記錄進日志
        }
        ...
          catch(定義一個異常變量接受try中異常變量){
            異常處理邏輯,工作中會把信息記錄進日志
        }finally{
           無論代碼是否出現異常,這里都會執行
        }
        注:finally不能單獨使用,必須與try一起用,finally一般用於資源釋放,無論程序是否有異常,均需要釋放資源

*/

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

public class Throwable {
    public static void main(String[] args) /*throws IOException*/ {
        //RuntimeException可以不用自己處理交給JVM
        //int[] num=new int[5];
        //getElement(num,6);

        //編譯異常,需要自己處理,使用throws
        //readFile("c:\\b.txt");不會執行,因為上面的異常JVM讓程序已經中斷

        //使用try catch
        try {
            readFileC("c:\\b.txt");  //有可能出現異常的代碼
        } catch (ArrayIndexOutOfBoundsException e) {//throws聲明的什么異常,就用來生成對象來接收
            //異常處理邏輯
            /*
        Throwable類中定義了三個方法:
             String toString()    - 返回此 throwable 的詳細消息字符串。
             StackTraceElement[] getStackTrace() - 提供編程訪問由 printStackTrace() 輸出的堆棧跟蹤信息,JVM打印默認調用此方法
             String getMessage() -返回此 throwable 的簡短描述。
           */
            System.out.println(e.toString());   //java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
            System.out.println(e.getMessage()); //Index 4 out of bounds for length 3
            System.out.println(e.getStackTrace()); //[Ljava.lang.StackTraceElement;@4e50df2e
        }finally {
            System.out.println("資源釋放");  //finally無論是否異常,均執行
        }
        System.out.println("勞資沒有中斷,太強了");


    }


    public static void getElement(int[] arr, int index) {

        //運行期異常,可以不用自己處理
        if (index > 4 || index < 0) {
            throw new ArrayIndexOutOfBoundsException("數組索引有問題");  //ArrayIndexOutOfBoundsException運行期異常,交給JVM,不用自己throw
        }
        //在Objects里有個判斷NullPointerException的方法可以判斷 對象 是否為空,簡化上述代碼
        //格式Objects.requireNonNull(對象名);
        //另一個重載Objects.requireNonNull(對象名,"拋出的信息")

    }

    /*
    定義一個方法,對傳遞的文件路徑合法化判斷,使用throws
                由於FileNotFoundException extends IOException
                所以聲明IOException即可
     */
    public static void readFile(String src) throws IOException {
        //拋出文件位置異常
        if (!src.equals("c:\\a.txt")) {
            throw new FileNotFoundException("文件位置不匹配");
        }
        //拋出文件后綴異常
        if (!src.endsWith(".txt")) {
            throw new IOException("文件位置不匹配");

        }
    }

    public static void readFileC(String src) {
        List<Integer> integers = List.of(1, 2, 3);
        integers.get(4);

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM