2026-06-08 05:58:26
Java中的异常分类基于Throwable根类,主要分为Error和Exception两大类,其中Exception又细分为运行时异常和受检异常。以下是具体分类及说明:
1. Error(JVM相关错误)OutOfMemoryError:内存不足时抛出。
StackOverflowError:递归调用过深导致栈溢出。
NoClassDefFoundError:类加载失败。
无需捕获:Error无法通过try-catch恢复,程序通常需终止。
解决方案:优化程序逻辑(如减少递归深度)或调整JVM参数(如增加堆内存)。
运行时异常(RuntimeException):
特点:编译器不强制处理,程序逻辑错误导致(如空指针、数组越界)。
常见类型:
NullPointerException:访问空对象属性或方法。
IndexOutOfBoundsException:数组/集合越界访问。
ArithmeticException:除数为零的算术错误。
IllegalArgumentException:参数不合法(如传入null)。
处理建议:
优先修复代码:而非简单捕获,避免掩盖逻辑错误。
防御性编程:如检查参数非空、数组边界等。
受检异常(Checked Exception):
特点:编译器强制处理,需通过try-catch或throws声明。
常见类型:
IOException:文件读写、网络通信失败。
SQLException:数据库操作错误。
ClassNotFoundException:类未找到。
处理建议:
明确处理逻辑:如重试、回滚或提示用户。
避免过度使用:过度捕获会导致代码臃肿,需权衡健壮性与可读性。
底层方法抛出受检异常,高层方法统一处理(如日志记录或用户提示)。
示例:public void readFile() throws IOException { // 文件操作可能抛出IOException}public void processFile() { try { readFile(); } catch (IOException e) { System.err.println("文件读取失败: " + e.getMessage()); }}
减少异常创建:避免在正常流程中使用异常控制逻辑(如用if检查替代try-catch)。
资源释放:使用try-with-resources自动关闭资源(如文件流、数据库连接)。try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { // 自动关闭br} catch (IOException e) { e.printStackTrace();}
使用堆栈跟踪(StackTrace)定位异常源头。
结合日志框架(如Log4j)记录异常上下文。
运行时异常:逻辑错误,优先修复代码。
受检异常:外部依赖问题,需显式处理。