java中的异常,区别?

一、Throwable是所有异常的根,java.lang.Throwable

Error是错误,java.lang.Error
Exception是异常,java.lang.Exception

二、Exception 

一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。

①Checked异常   : 可以被处理的异常;处理方式有两种 1 try......catch块处理;2 当前方法不知道如何处理异常,则在方法上声明抛                                   出该异常。

   常见的检查异常有:Java.lang.ClassNotFoundException,Java.lang.NoSuchMetodException,java.io.IOException

②RuntimeException :产生运行时异常的原因比较多,如下标越界,空指针,除数为0等,若显示声明或者捕获将会对程序的可                                               读性和运行效率影响很大。

 常见的运行异常有:Java.lang.IndexOutOfBoundsException,Java.lang.NullPointerException

 

<think>我们正在讨论Java异常的分类和区别。根据引用内容,Java异常主要分为两大类:Error(错误)和Exception(异常)。它们都是Throwable类的子类。 1. **Error(错误)**: - 表示程序无法处理的严重问题,通常由JVM(Java虚拟机)生成并抛出。 - 例如:内存溢出(OutOfMemoryError)、栈溢出(StackOverflowError)等。 - 这些错误通常与程序员的代码逻辑无关,而是系统级别的资源问题。因此,程序一般无法处理它们,也不需要在代码中捕获或声明。 2. **Exception(异常)**: - 表示程序可以处理的异常情况,又分为两类: - **受检异常(Checked Exceptions)**:在编译时检查,必须被处理(要么用try-catch捕获,要么用throws声明抛出)。例如:IOException、SQLException等。 - **非受检异常(Unchecked Exceptions)**:包括运行时异常(RuntimeException及其子类)和错误(Error)。运行时异常在编译时不检查,程序可以选择处理或不处理。例如:NullPointerException、IndexOutOfBoundsException等。 区别总结: - **Error**:严重错误,程序无法处理,通常由JVM抛出。 - **Exception**:程序可以处理的异常,分为受检异常(必须处理)和非受检异常(运行时异常,可处理也可不处理)。 下面用代码示例说明: ```java // 受检异常示例:必须处理(捕获或声明抛出) public void readFile() throws IOException { // 声明抛出 FileReader file = new FileReader("test.txt"); // ... 读取文件 } // 运行时异常(非受检异常)示例:可以不处理,但发生时会中断程序 public void divide(int a, int b) { if (b == 0) { throw new ArithmeticException("除数不能为零"); // 运行时异常 } System.out.println(a / b); } // 错误示例:通常无法处理 public void triggerError() { // 无限递归导致栈溢出错误 triggerError(); } ``` 相关问题: 1. 受检异常和非受检异常在代码处理上有什么不同? 2. 为什么错误(Error)不需要捕获? 3. 常见的运行时异常有哪些?请举例说明。 4. 如何在自定义异常中选择继承Exception还是RuntimeException?</think>### Java异常分类及区别 #### 一、异常的两大基本分类 根据Java异常体系,所有异常都继承自`java.lang.Throwable`类,主要分为两大子类: 1. **错误(Error)** - 表示**系统级严重问题**,通常由JVM抛出 - 特点:程序**无法恢复**,也不需要程序员处理 - 常见子类: - `OutOfMemoryError`(内存耗尽) - `StackOverflowError`(栈溢出) - `VirtualMachineError`(虚拟机错误) 2. **异常(Exception)** - 表示**程序可处理的异常情况** - 特点:可以通过代码**捕获并恢复** - 进一步细分为两类: - **受检异常(Checked Exceptions)** - **非受检异常(Unchecked Exceptions)** #### 二、核心区别对比 | 特性 | 错误(Error) | 异常(Exception) | |---------------------|-------------------------------|-------------------------------| | **来源** | JVM或系统底层问题 | 程序逻辑问题 | | **可恢复性** | ❌ 不可恢复 | ✅ 可恢复 | | **处理要求** | ❌ 无需捕获处理 | ✅ 必须显式处理 | | **继承关系** | `Throwable` → `Error` | `Throwable` → `Exception` | | **典型示例** | `OutOfMemoryError` | `IOException`, `SQLException`| #### 三、异常的子类详解 1. **受检异常(Checked Exceptions)** - **编译时检查**:必须在代码中显式处理(`try-catch`或`throws`声明) - **可恢复性**:通常表示外部资源问题(文件丢失、网络中断等) - **常见类型**: - `IOException`(文件操作异常) - `SQLException`(数据库操作异常) - `ClassNotFoundException`(类加载失败) ```java // 必须处理受检异常示例 public void readFile() throws IOException { // 声明抛出 FileReader file = new FileReader("test.txt"); // ...文件操作 } ``` 2. **非受检异常(Unchecked Exceptions)** - **运行时发生**:编译时不强制处理 - **根源**:程序逻辑错误(可通过代码修正避免) - 包含两类: - **运行时异常(RuntimeException)** - `NullPointerException`(空指针) - `ArrayIndexOutOfBoundsException`(数组越界) - `ClassCastException`(类型转换错误) - **错误(Error)**(已单独归类) ```java // 运行时异常示例(可处理但不强制) public void calculate() { try { int result = 10 / 0; // 触发ArithmeticException } catch (ArithmeticException e) { System.out.println("除零错误"); } } ``` #### 四、异常处理机制 1. **错误处理原则**: - Error:**不应捕获**,需修复根本问题(如内存泄漏) - Checked Exceptions:**必须处理**,保证程序健壮性 - Unchecked Exceptions:**建议处理**,避免程序崩溃 2. **异常处理代码示例**: ```java public void processResource() { try { // 可能抛出受检异常的操作 loadDatabaseConnection(); } catch (SQLException e) { // 捕获受检异常 System.err.println("数据库错误: " + e.getMessage()); } catch (RuntimeException e) { // 捕获运行时异常 System.err.println("运行时错误: " + e.getClass().getSimpleName()); } finally { releaseResources(); // 确保资源释放 } } ``` #### 五、自定义异常 可继承`Exception`创建受检异常,或继承`RuntimeException`创建非受检异常: ```java // 自定义受检异常 public class PaymentFailedException extends Exception { public PaymentFailedException(String message) { super(message); } } // 自定义非受检异常 public class InvalidInputException extends RuntimeException { public InvalidInputException(String field) { super("无效字段: " + field); } } ``` > **关键总结**: > - Error是**系统级灾难**(不处理) > - Exception是**程序级问题**(需处理) > - 受检异常强制处理保证**代码健壮性** > - 非受检异常暴露**程序逻辑缺陷**[^1][^2][^3] --- ### 相关问题 1. 为什么`NullPointerException`属于非受检异常?[^4] 2. 受检异常和非受检异常在继承体系上有何区别? 3. 如何选择自定义异常继承`Exception`还是`RuntimeException`? 4. `try-with-resources`语句如何简化受检异常处理? 5. 错误(Error)和异常(Exception)在JVM处理机制上有何不同?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值