温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java异常类型及处理方法

发布时间:2021-07-13 14:53:13 来源:亿速云 阅读:141 作者:chen 栏目:开发技术

这篇文章主要介绍“Java异常类型及处理方法”,在日常操作中,相信很多人在Java异常类型及处理方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java异常类型及处理方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 一、异常定义

  • 二、异常的结构和分类

  • 三、异常的处理和捕获

  • 四、自定义异常

  • 五、异常的应用

    • 1.打印堆栈

    • 2.弹出流程

  • 六、注意点

    一、异常定义

    异常就是“意外、例外”的意思,也就是非正常情况。异常本质上是程序上的错误,包括程序逻辑错误和系统错误。异常的处理基本上就是用来兜底的,也是程序开发中程序不愿意看到的。异常最基本的信息就是线程的堆栈信息。

    二、异常的结构和分类

    Java异常类型及处理方法

    Throwable主要分为Error和Exception。

    错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,躺平解决就好,不要反抗。常见的错误有下面这些

    Java异常类型及处理方法

    异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心,能在程序中解决的都不叫事。常见的异常有这么多。

    Java异常类型及处理方法

    三、异常的处理和捕获

    异常想要处理肯定要先捕获到异常才可以,怎么捕获异常呐,Java给我提供了几个关键字,每个关键字怎么用呐?

    1、try,catch 就是直接捕获异常,catch 内的异常类型是能捕获的类型,一般如果有多个异常,从上到下的顺序是异常范围越来越大。注: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关键字,就是在异常之后还能做一些事情,比如常见的关闭输入流,输出流,是程序最后的倔强。

    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 主要用来创建一个异常,因为程序中可能需要抛出一个异常,比如我们游戏服务器游戏逻辑验证客户端参数不通过,会主动抛出一个自定义的异常

    4、throws 主要用在方法签名上,当我们读写文件或者反射的时候,如果不用try catch 就会发现方法签名后有一堆的异常需要处理。异常会继续上抛给上层的调用方法,直至有方法处理或者给系统。

    四、自定义异常

    当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。

    如果要自定义异常类,则继承Exception类即可。可以在类中增加一些自己的处理,在创建异常的时候传入,在处理异常的地方,可以根据具体的内容进行处理。可以看下下面的弹出流程应用。

    /**
    * @author 香菜
    */
    public class ErrorCodeException extends Exception {
       //错误码
       private String errorCode;
       //构造函数
       public ErrorCodeException(String errorCode){
           super(errorCode);
           this.errorCode = errorCode;
      }
       public String getErrorCode() {
           return errorCode;
      }
    }

    五、异常的应用

    在游戏开发中,每个协议的处理都会验证参数的是否合理,如果发现参数不合理,我们可以抛出一个自定义的参数异常,在同一的入口处进行捕获,解析出其中的错误码,直接发给客户端。避免了一层一层的函数返回。

    1.打印堆栈

    有时候在调试代码的过程中,因为函数的调用处太多,游戏不好断点,我们可以在想要知道函数的调用路径的情况下,可以随意抛出一个异常,系统会打印出调用堆栈,帮忙定位问题。是不是又获得一个小技巧。

    /**
    * @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异常类型及处理方法

    从上面大堆栈打印可以看到,打印的语句没有执行,在游戏服务器的消息处理处捕获一个ErrorCodeException,如果消息处理函数抛出这个异常,在入口处会捕获并解析其中的错误码返回给客户端,可以避免一层一层的返回函数

    六、注意点

    1、Java程序可以是多线程的。每一个线程都是一个独立的执行流,独立的函数调用栈。如果程序只有一个线程,那么没有被任何代码处理的异常 会导致程序终止。如果是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束

    2、finally 不具有再次处理异常的能力

    3、不要只捕获异常而不处理异常,就会发现不了问题。

    到此,关于“Java异常类型及处理方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI