Java中的异常机制
目录
Error(错误)
Exception(异常)
受检异常(Checked Exception)
非受检异常(Unchecked Exception)
图示总结:
异常处理机制
try-catch-finally
throws关键字
图示总结:
自定义异常
图示:
异常处理最佳实践
在理想状态下,用户输入数据的格式永远都是正确的,选择打开的文件也一定存在,并且永远不会出现bug。然而,在现实世界中却充满了不良的数据和带有问题的代码,现在是讨论Java程序设计语言处理这些问题的机制的时候了。
Error(错误)
Error是程序无法处理的严重问题,表示系统级错误,通常由JVM抛出。
示例:
Error | 释义 |
---|---|
ThreadDeath | 线程终止错误 |
OutOfMemoryError | 内存不足 |
StackOverFlowError | 栈溢出 |
NoClassDefFoundError | 类定义未找到 |
Exception(异常)
受检异常(Checked Exception)
关于受检异常我们必须知道:
- 编译时检查,必须处理否则无法通过编译
- 例子:ClassNotFoundException, IOException
特点:
- 继承自Exception但不继承RuntimeException
- 代表预期可能发生的问题
- 必须用try-catch捕获或throws声明
非受检异常(Unchecked Exception)
关于非受检异常我们必须知道:
- IndexOutOfBoundsException
- NullPointerException
特点:
- 继承自RuntimeException
- 编译时不强制处理
- 通常是程序逻辑错误导致
图示总结:
异常处理机制
try-catch-finally
try {// 可能出现异常的代码
} catch (ExceptionType1 e1) {// 处理ExceptionType1
} catch (ExceptionType2 e2) {// 处理ExceptionType2
} finally {// 无论是否发生异常都会执行的代码
}
throws关键字
if (input == null) {throw new NullPointerException("输入不能为null");
}
图示总结:
自定义异常
创建方法:
// 继承Exception或RuntimeException
class MyException extends Exception {public MyException(String message) {super(message);}
}
图示:
异常处理最佳实践
- 精准捕获:不要直接捕获Exception,应捕获具体异常类型
- 资源管理:使用try-with-resources替代finally
try (InputStream is = new FileInputStream("file.txt")) {// 使用资源 } catch (IOException e) {// 处理异常 }
- 异常信息:提供有意义的错误信息
- 避免空catch块:至少记录异常
- 异常转换:将底层异常转换为适合业务层的异常