一、什么是Exception

Exception是在程序运行时发生的意外情况,如果不能正确处理可能导致程序终止或直接崩溃
比如试图打开一个根本不存在的文件。

二、Exception的分类

java Exception

Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,ErrorException

  1. Error是错误,表示运行应用程序中出现了严重的问题,都是通过Error抛出的,一般是程序不能处理的系统错误。错误是没法处理的。

    • 一般标识代码运行时JVM出现的问题,如内存溢出、栈溢出等这类错误与硬件有关,通常由系统进行处理,程序本身无法捕获和处理。
    • 常见的Error有OutOfMemoryErrorNoClassDefFoundErrorStackOverflowError
  2. Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的问题。异常是可以被处理的。可分为两类 Unchecked ExceptionsChecked Exceptions

    • Unchecked Exceptions 在编译时不进行检查。继承自RuntimeException的类,便是unchecked exceptions
    • Checked Exceptions 在编译时进行检查的异常。继承Exception的类 ,除了UncheckedException以外都是checked exceptions。 如果程序中存在这类异常 则编译器强制开发者在编译时编写异常处理程序 可以通过 try catch捕获 也可以通过throws抛出

思考ClassNotFoundException与NoClassDefFoundError的区别

ClassNotFoundException NoClassDefFoundError
继承java.lang.Exception 继承java.lang.Error
当动态加载Class的时候找不到类会抛出该异常 当编译成功以后执行过程中Class找不到导致抛出该错误
一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出 由JVM的运行时系统抛出

三、常见的Exception

Exception 描述 类型
IOException 输入输出异常 checked
NullPointerException 空指针异常类 unchecked
ClassCastException 类型强制转换异常 unchecked
SQLException 操作数据库异常 checked
FileNotFoundException 文件未找到异常 checked
ArrayIndexOutOfBoundsException 数组下标越界异常 unchecked
NumberFormatException 字符串转换为数字异常 unchecked
NoSuchMethodException 方法未找到异常 checked
ArithmeticException 算术异常类 unchecked

四、如何处理Exception

java Exception

java Exception

找到异常出现的逻辑、使用完整的数据测试、形成有针对性的异常处理

五、自定义Exception

在复杂业务环境下,java自带的异常可能满足不了我们业务的需求, 这个时候我们可以自定义异常来进行对业务异常的处理;
java Exception

可以在上层针对自己定义的异常做catch以及特殊的业务处理

六、注意

有异常但是没有堆栈信息
出于性能优化考虑 ,从JDK5之后对于频繁抛出的异常 在JIT重新编译后会抛出没有堆栈的异常 只打印摘要信息。在使用server模式下 这个优化是开启的
解决方法:重启服务 或者查看之前的老日志

现象:程序执行异常 但是使用try catch(Exception e)没有抓到异常
实际抛出的是Error 类型的错误 使用Exception抓不到对应的异常 改成 try catch(Throwable e)
抓到的报错:java.lang.NoSuchMethodError: io.netty.util.concurrent.SingleThreadEventExecutor 错误原因是netty包冲突 实际使用时用了版本低的

相关文章: