溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java異常類型及處理方法

發(fā)布時間:2021-07-13 14:53:13 來源:億速云 閱讀:154 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java異常類型及處理方法”,在日常操作中,相信很多人在Java異常類型及處理方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java異常類型及處理方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 一、異常定義

  • 二、異常的結(jié)構(gòu)和分類

  • 三、異常的處理和捕獲

  • 四、自定義異常

  • 五、異常的應用

    • 1.打印堆棧

    • 2.彈出流程

  • 六、注意點

    一、異常定義

    異常就是“意外、例外”的意思,也就是非正常情況。異常本質(zhì)上是程序上的錯誤,包括程序邏輯錯誤和系統(tǒng)錯誤。異常的處理基本上就是用來兜底的,也是程序開發(fā)中程序不愿意看到的。異常最基本的信息就是線程的堆棧信息。

    二、異常的結(jié)構(gòu)和分類

    Java異常類型及處理方法

    Throwable主要分為Error和Exception。

    錯誤:Error類以及他的子類的實例,代表了JVM本身的錯誤。錯誤不能被程序員通過代碼處理,躺平解決就好,不要反抗。常見的錯誤有下面這些

    Java異常類型及處理方法

    異常:Exception以及他的子類,代表程序運行時發(fā)送的各種不期望發(fā)生的事件。可以被Java異常處理機制使用,是異常處理的核心,能在程序中解決的都不叫事。常見的異常有這么多。

    Java異常類型及處理方法

    三、異常的處理和捕獲

    異常想要處理肯定要先捕獲到異常才可以,怎么捕獲異常吶,Java給我提供了幾個關(guān)鍵字,每個關(guān)鍵字怎么用吶?

    1、try,catch 就是直接捕獲異常,catch 內(nèi)的異常類型是能捕獲的類型,一般如果有多個異常,從上到下的順序是異常范圍越來越大。注:ErrorCodeException的定義可以參考自定義異常。

      public static void second(String[] args) {
          try {
              throw new ErrorCodeException("1123");
          } catch (ErrorCodeException e) {
              e.printStackTrace();
          }catch (Exception e){
              e.printStackTrace();
          }
      }

    2、try catch finally 增加了finally關(guān)鍵字,就是在異常之后還能做一些事情,比如常見的關(guān)閉輸入流,輸出流,是程序最后的倔強。

    public static String readFileContent(String fileName) {
      File file = new File(fileName);
      BufferedReader reader = null;
      StringBuffer sbf = new StringBuffer();
      try {
          reader = new BufferedReader(new FileReader(file));
          String tempStr;
          while ((tempStr = reader.readLine()) != null) {
              sbf.append(tempStr);
          }
          reader.close();
          return sbf.toString();
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          if (reader != null) {
              try {
                  reader.close();
              } catch (IOException e1) {
                  e1.printStackTrace();
              }
          }
      }
      return sbf.toString();
    }

    3、throw 主要用來創(chuàng)建一個異常,因為程序中可能需要拋出一個異常,比如我們游戲服務器游戲邏輯驗證客戶端參數(shù)不通過,會主動拋出一個自定義的異常

    4、throws 主要用在方法簽名上,當我們讀寫文件或者反射的時候,如果不用try catch 就會發(fā)現(xiàn)方法簽名后有一堆的異常需要處理。異常會繼續(xù)上拋給上層的調(diào)用方法,直至有方法處理或者給系統(tǒng)。

    四、自定義異常

    當Java內(nèi)置的異常都不能明確的說明異常情況的時候,需要創(chuàng)建自己的異常。

    如果要自定義異常類,則繼承Exception類即可??梢栽陬愔性黾右恍┳约旱奶幚?,在創(chuàng)建異常的時候傳入,在處理異常的地方,可以根據(jù)具體的內(nèi)容進行處理??梢钥聪孪旅娴膹棾隽鞒虘谩?/p>

    /**
    * @author 香菜
    */
    public class ErrorCodeException extends Exception {
       //錯誤碼
       private String errorCode;
       //構(gòu)造函數(shù)
       public ErrorCodeException(String errorCode){
           super(errorCode);
           this.errorCode = errorCode;
      }
       public String getErrorCode() {
           return errorCode;
      }
    }

    五、異常的應用

    在游戲開發(fā)中,每個協(xié)議的處理都會驗證參數(shù)的是否合理,如果發(fā)現(xiàn)參數(shù)不合理,我們可以拋出一個自定義的參數(shù)異常,在同一的入口處進行捕獲,解析出其中的錯誤碼,直接發(fā)給客戶端。避免了一層一層的函數(shù)返回。

    1.打印堆棧

    有時候在調(diào)試代碼的過程中,因為函數(shù)的調(diào)用處太多,游戲不好斷點,我們可以在想要知道函數(shù)的調(diào)用路徑的情況下,可以隨意拋出一個異常,系統(tǒng)會打印出調(diào)用堆棧,幫忙定位問題。是不是又獲得一個小技巧。

    /**
    * @author 香菜
    */
    public class Aain {
       public static void first(String[] args) throws Exception {
           second(args);
      }
       public static void second(String[] args) throws Exception {
           throw new Exception("1123");
      }
       public static void main(String[] args) throws Exception {
               first(args);
      }
    }

    2.彈出流程

    /**
    * @author 香菜
    */
    public class Aain {
      public static void first(String[] args) throws ErrorCodeException {
          second(args);
      }
      public static void second(String[] args) throws ErrorCodeException {
          third(args);
          System.out.println("1111");
      }
      public static void third(String[] args) throws ErrorCodeException {
          throw new ErrorCodeException("1123");
      }
      public static void main(String[] args){
          try {
              first(args);
          } catch (ErrorCodeException e) {
              e.printStackTrace();
          }
      }
    }

    Java異常類型及處理方法

    從上面大堆棧打印可以看到,打印的語句沒有執(zhí)行,在游戲服務器的消息處理處捕獲一個ErrorCodeException,如果消息處理函數(shù)拋出這個異常,在入口處會捕獲并解析其中的錯誤碼返回給客戶端,可以避免一層一層的返回函數(shù)

    六、注意點

    1、Java程序可以是多線程的。每一個線程都是一個獨立的執(zhí)行流,獨立的函數(shù)調(diào)用棧。如果程序只有一個線程,那么沒有被任何代碼處理的異常 會導致程序終止。如果是多線程的,那么沒有被任何代碼處理的異常僅僅會導致異常所在的線程結(jié)束

    2、finally 不具有再次處理異常的能力

    3、不要只捕獲異常而不處理異常,就會發(fā)現(xiàn)不了問題。

    到此,關(guān)于“Java異常類型及處理方法”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI