服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java异常类型及处理

Java异常类型及处理

2021-10-07 12:18香菜聊游戏 Java教程

这篇文章主要介绍了Java异常出现原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、异常定义

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

 

二、异常的结构和分类

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、不要只捕获异常而不处理异常,就会发现不了问题。

 

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多文章!

原文链接:https://gamwatcher.blog.csdn.net/article/details/116504138

延伸 · 阅读

精彩推荐
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18