JAVA中异常体系总结
一、异常体系总体结构
所有异常的父类都是Exception;
但凡是异常对象,无论原因,都可以被抛出。
二、异常分类
(一)、Error(错误)
特点:严重问题,应用程序通常无法处理;由JVM(JAVA虚拟机)产生和抛出
常见子类:
-
VirtualMachineError(虚拟机错误)
-
OutOfMemoryError(内存溢出)
-
StackOverflowError(栈溢出)
-
NoClassDefFoundError(类定义未找到)
(二)、 Exception(异常)
(1) RuntimeException(运行时异常/非受检异常)
特点:由程序逻辑产生的异常,不强制捕获
常见子类:
-
NullPointerException(空指针)
-
ArrayIndexOutOfBoundsException(数组越界)
-
ClassCastException(类型转换异常)
-
IllegalArgumentException(非法参数)
-
ArithmeticException(算术异常)
(2) 非RuntimeException(受检异常)
特点:必须捕获或声明抛出;从语法角度上必须解决的异常,如果不解决就无法编译通过
常见子类:
-
IOException(IO异常)
-
SQLException(SQL异常)
-
FileNotFoundException(文件未找到)
-
ClassNotFoundException(类未找到)
-
InterruptedException(线程中断)
三、异常处理机制
(一)、try-catch-finally 结构
当抛出一个异常时,可以在try-catch 块中捕获和处理它;
try语句块中:放的是可能出现问题的代码;
catch语句块中:放的是出现问题并捕获后,处理问题的代码code;如果问题在try语句块中没有出现 则catch中不会运行。
finally语句块中:放的是不管问题异常是否产生 都要执行的代码code。
(二)、throws声明
在 Java 中,当前执行的语句必属于某个方法。Java 解释器调用 main 方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。这称为声明异常( declaring exception)。只对编译时异常进行声明,告知方法的调用者有异常。
public void method() throws IOException, SQLException {// 方法代码
}
(三)、throws抛出异常
检测到错误的程序可以创建一个合适的异常类型的实例并抛出它,这就称为抛出一个异常。
throw new ExceptionType("错误信息");
声明异常的关楗字是 throws, 抛出异常的关键字是 throw。
四、异常处理实践
1、异常捕获原则:
-
具体异常优先于通用异常
-
不要捕获Throwable/Error
-
不要忽略捕获的异常(空catch块)
2、异常使用原则:
-
对可恢复情况使用受检异常
-
对编程错误使用运行时异常
-
避免在循环中使用try-catch
3、自定义异常:
public class MyException extends Exception {public MyException(String message) {super(message);}
}
4、异常链
try {// 代码
} catch (Exception e) {throw new MyException("新异常信息", e); // 传递原始异常
}