今日继续深入研读了Java中的异常处理机制
Java中的异常主要分为两大类:受检查异常(checked exceptions)和非受检查异常(unchecked exceptions)。
受检查异常:是指那些在编译时需要显式处理的异常,如IOException、SQLException等。这类异常通常与程序的运行环境相关,如文件操作、网络通信等。当方法中可能出现受检查异常时,要么在方法内部通过try-catch语句捕获并处理,要么在方法签名中通过throws关键字声明抛出该异常,告知调用者需要处理该异常。
例如:public void readFile() throws IOException {
FileReader fileReader = new FileReader("example.txt");
// 文件读取操作
}在这个方法中,通过throws IOException声明了可能抛出IOException异常,调用该方法时就需要处理这个异常。
非受检查异常:包括运行时异常(RuntimeException)及其子类,如NullPointerException、ArrayIndexOutOfBoundsException等。这类异常通常是由程序的逻辑错误引起的,如访问空对象的成员、数组索引越界等。Java编译器不会强制要求程序员处理这些异常,但合理地处理它们可以避免程序在运行时突然崩溃。例如,在访问数组元素之前,可以先检查索引是否越界:
int[] array = {1, 2, 3};
if (index >= 0 && index < array.length) {
System.out.println(array[index]);
} else {
throw new ArrayIndexOutOfBoundsException("索引越界");
}
在某些情况下,Java内置的异常类型可能无法完全满足特定业务场景的需求,这时可以自定义异常类。自定义异常类需要继承自Exception类(受检查异常)或其子类,如RuntimeException(非受检查异常)。通过自定义异常,可以更精准地描述业务错误,为异常处理提供更丰富的信息。
例如,定义一个用于表示用户输入数据格式不正确的自定义异常类:
public class DataFormatException extends Exception {
public DataFormatException(String message) {
super(message);
}
}
在业务逻辑中,当检测到用户输入的数据不符合要求时,就可以抛出这个自定义异常:
public void processData(String data) throws DataFormatException {
if (!isValid(data)) {
throw new DataFormatException("数据格式不正确");
}
// 处理数据
}