一、什么是Exception
Exception是在程序运行时发生的意外情况,如果不能正确处理可能导致程序终止或直接崩溃。
比如试图打开一个根本不存在的文件。
二、Exception的分类
Throwable
是所有异常的共同祖先,异常都是从Throwable
继承而来的。Throwable
有两个子类,Error
和Exception
-
Error是错误,表示运行应用程序中出现了严重的问题,都是通过Error抛出的,一般是程序不能处理的系统错误。错误是没法处理的。
- 一般标识代码运行时JVM出现的问题,如内存溢出、栈溢出等这类错误与硬件有关,通常由系统进行处理,程序本身无法捕获和处理。
- 常见的Error有
OutOfMemoryError
、NoClassDefFoundError
、StackOverflowError
-
Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的问题。异常是可以被处理的。可分为两类
Unchecked Exceptions
、Checked 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
找到异常出现的逻辑、使用完整的数据测试、形成有针对性的异常处理
五、自定义Exception
在复杂业务环境下,java自带的异常可能满足不了我们业务的需求, 这个时候我们可以自定义异常来进行对业务异常的处理;
可以在上层针对自己定义的异常做catch以及特殊的业务处理
六、注意
有异常但是没有堆栈信息
出于性能优化考虑 ,从JDK5之后对于频繁抛出的异常 在JIT重新编译后会抛出没有堆栈的异常 只打印摘要信息。在使用server模式下 这个优化是开启的
解决方法:重启服务 或者查看之前的老日志
现象:程序执行异常 但是使用try catch(Exception e)没有抓到异常
实际抛出的是Error 类型的错误 使用Exception抓不到对应的异常 改成 try catch(Throwable e)
抓到的报错:java.lang.NoSuchMethodError: io.netty.util.concurrent.SingleThreadEventExecutor
错误原因是netty包冲突 实际使用时用了版本低的