最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java異常類型及處理

 更新時間:2021年07月13日 11:34:29   作者:香菜聊游戲  
這篇文章主要介紹了Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、異常定義

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

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

圖片

Throwable主要分為Error和Exception。

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

圖片

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

圖片

三、異常的處理和捕獲

異常想要處理肯定要先捕獲到異常才可以,怎么捕獲異常吶,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)容進行處理??梢钥聪孪旅娴膹棾隽鞒虘?。

/**
* @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();
      }
  }
}

圖片

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

六、注意點

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

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

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

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多文章!

相關(guān)文章

  • SpringMVC全局異常處理小結(jié)

    SpringMVC全局異常處理小結(jié)

    在開發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過程解耦出來,既保證了相關(guān)處理過程的功能較單一,也實現(xiàn)了異常信息的統(tǒng)一處理和維護,本文介紹SpringMVC全局異常處理,感興趣的朋友一起看看吧
    2024-03-03
  • java構(gòu)造函數(shù)示例(構(gòu)造方法)

    java構(gòu)造函數(shù)示例(構(gòu)造方法)

    這篇文章主要介紹了java構(gòu)造函數(shù)示例(構(gòu)造方法),需要的朋友可以參考下
    2014-03-03
  • Java基礎(chǔ):流Stream詳解

    Java基礎(chǔ):流Stream詳解

    Stream流是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列。這篇文章主要介紹了Java8新特性Stream流的相關(guān)資料,需要的朋友參考下吧
    2021-09-09
  • Spring?Security?登錄時添加圖形驗證碼實現(xiàn)實例

    Spring?Security?登錄時添加圖形驗證碼實現(xiàn)實例

    這篇文章主要為大家介紹了Spring?Security?登錄時添加圖形驗證碼實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • mybatis攔截器無法注入spring bean的問題解決

    mybatis攔截器無法注入spring bean的問題解決

    本文主要介紹了mybatis攔截器無法注入spring bean的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-02-02
  • Spring Boot整合Spring Data JPA過程解析

    Spring Boot整合Spring Data JPA過程解析

    這篇文章主要介紹了Spring Boot整合Spring Data JPA過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明

    關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明

    這篇文章主要介紹了關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java線程組與未處理異常實例分析

    Java線程組與未處理異常實例分析

    這篇文章主要介紹了Java線程組與未處理異常,結(jié)合實例形式分析了java線程組處理異常的相關(guān)技巧與操作注意事項,需要的朋友可以參考下
    2019-09-09
  • java?String到底有多長?String超出長度該如何解決

    java?String到底有多長?String超出長度該如何解決

    在Java中,由于字符串常量池的存在,String常量長度限制取決于String常量在常量池中的存儲大小,下面這篇文章主要給大家介紹了關(guān)于java?String到底有多長?String超出長度該如何解決的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java和JVM的重載識別,重寫方法是怎樣進行的

    Java和JVM的重載識別,重寫方法是怎樣進行的

    這篇文章主要介紹了Java和JVM的重載識別,重寫方法是怎樣進行的,違章圍繞了Java和JVM的重載識別,重寫方法展開相關(guān)資料,需要的小伙伴可以參考一下,希望對你的工作或?qū)W習有所幫助
    2022-01-01

最新評論

宣城市| 岢岚县| 应城市| 本溪| 辽宁省| 乌什县| 南平市| 开封市| 瓦房店市| 宁河县| 历史| 阳江市| 桃园市| 卓尼县| 麟游县| 铜陵市| 光泽县| 左贡县| 通海县| 永善县| 扎鲁特旗| 克拉玛依市| 建湖县| 新乡市| 泰安市| 象山县| 庄河市| 屯昌县| 宜川县| 惠来县| 寿光市| 深水埗区| 阜新| 饶河县| 陆良县| 太和县| 通道| 九江市| 和静县| 哈密市| 墨玉县|