error和execption区别?

1 个回答

  • 西丝
    做自己,而不是解释自己。
    `Error` 和 `Exception` 都继承自 `Throwable`,但语义和使用场景完全不同。 ## 1. 继承结构 ```plaintext java.lang.Object └── java.lang.Throwable ├── java.lang.Error └── java.lang.Exception └── java.lang.RuntimeException ``` ## 2. 区别对比 | 对比项 | Error | Exception | | ---------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------ | | 含义 | **严重错误**,通常是 JVM 层面或系统层面的错误,非程序本身问题 | **异常**,通常是程序运行过程中出现的可预期问题 | | 设计目的 | 表示无法通过程序处理或恢复的严重问题 | 表示可以通过程序捕获并恢复的异常情况 | | 常见子类 | `OutOfMemoryError`、`StackOverflowError`、`VirtualMachineError` | `IOException`、`SQLException`、`NullPointerException`、`IllegalArgumentException` | | 是否建议捕获 | **不建议**,因为多数是系统级问题,捕获也难以恢复 | **建议**根据业务需要捕获处理 | | 检查型 / 非检查型 | 都是非检查型(编译期不强制处理) | 分两类:检查型(Checked Exception)和非检查型(Unchecked Exception) | | 恢复可能性 | 极低(多为硬件、JVM崩溃等) | 高(比如参数校验失败、文件不存在等) | ## 3. 使用场景举例 ### Error ```java public class Test { public static void main(String[] args) { // 模拟 StackOverflowError test(); } static void test() { test(); // 无限递归 } } ``` 运行时会抛出: ``` Exception in thread "main" java.lang.StackOverflowError ``` **不应该在代码里去 try-catch 这种错误**,因为无法有效恢复。 ### Exception ```java public class Test { public static void main(String[] args) { try { int a = 1 / 0; } catch (ArithmeticException e) { System.out.println("被零除异常:" + e.getMessage()); } System.out.println("程序可以继续运行"); } } ``` 输出: ``` 被零除异常:/ by zero 程序可以继续运行 ``` ## 4. 总结 * **Error**:系统级 / JVM 层面的问题,非业务逻辑导致,一般不用捕获。 * **Exception**:业务逻辑中可预见、可恢复的问题,需要按业务逻辑捕获并处理。 * 编码时处理重点应放在 **Exception**,而不是 **Error**。
    发布于 2025-08-14 04:52 •IP属地 河北
    举报
    评论
    收藏