异常有哪些分类?

所有异常都是 Throwable 的子类,分为 Error 和 Exception。Error 是Java 运行时系统的内部错误和资源耗尽错误,例如 StackOverFlowError 和 OutOfMemoryError,这种异常程序无法处理。


Exception 分为受检异常和非受检异常,受检异常需要在代码中显式处理,否则会编译出错,非受检异常是运行时异常,继承自 RuntimeException。


受检异常:
① 无能为力型,如字段超长导致的 SQLException。
② 力所能及型,如未授权异常 UnAuthorizedException,程序可跳转权限申请页面。常见受检异常还有FileNotFoundException、ClassNotFoundException、IOException等。


非受检异常:
① 可预测异常,例如IndexOutOfBoundsException、NullPointerException、ClassCastException
等,这类异常应该提前处理。
②需捕捉异常,例如进行 RPC调用时的远程服务超时,这类异常客户端必须显式处理,
③ 可透出异常,指框架或系统产生的且会自行处理的异常,例如 Spring的
NoSuchRequestHandingMethodException,Spring会自动完成异常处理,将异常自动映射到合话的状态码。

<think>好的,我现在要回答用户的问题:“异常分类有哪些?”首先,我需要回顾一下Java异常处理的基础知识,确保自己理解正确。用户之前问过关于finally块的问题,现在转向异常分类,可能是在深入学习异常处理机制。 Java异常分为检查型异常(checked exceptions)和非检查型异常(unchecked exceptions)。非检查型异常又包括运行时异常(RuntimeExceptions)和错误(Errors)。检查型异常需要在代码中显式处理,否则编译不通过。比如IOException、SQLException。运行时异常如NullPointerException、ArrayIndexOutOfBoundsException,通常由程序逻辑错误引起,不强制处理。错误如OutOfMemoryError,属于严重问题,一般程序无法处理。 接下来要确认这些分类是否准确,是否有遗漏。比如,是否还有其他子类或特殊情况?比如,用户自定义异常通常继承自Exception或RuntimeException,属于检查型或非检查型。需要明确说明自定义异常分类依据。 用户可能需要例子来理解不同类型的异常,所以应该举出具体的例子,比如检查型异常如FileNotFoundException,运行时异常如ArithmeticException,错误如StackOverflowError。同时,要说明它们的使用场景和处理方式,比如检查型异常必须用try-catch或throws,而非检查型异常通常不强制处理。 还需要考虑用户可能的误区,比如认为所有异常都需要捕获,或者混淆错误和异常的区别。要强调错误通常是不可恢复的,而异常可能有机会处理。 结构上,应该先总述分类,再分点详细说明每类,包括定义、特点、例子和处理方式。最后可以对比总结,帮助用户区分。同时,保持语言简洁,避免过于技术化,让不同层次用户都能理解。 可能需要验证一些细节,比如Java官方文档对异常分类是否如此。查阅资料确认检查型异常继承自Exception但不包括RuntimeException,而非检查型包括RuntimeException和Error及其子类。是的,正确。 最后,确保回答符合用户之前设定的格式要求:结构清晰,使用中文,行内公式正确(虽然这个问题可能不涉及数学公式,但要注意其他格式要求),分点说明,示例代码用反引号包裹。避免使用Markdown,用自然的分段和标题。</think>### **异常分类** 在 Java 中,异常根据其处理方式和严重程度分为 **检查型异常(Checked Exceptions)** 和 **非检查型异常(Unchecked Exceptions)**,后者进一步细分为 **运行时异常(RuntimeExceptions)** 和 **错误(Errors)**。以下是具体分类及特点: --- #### **一、检查型异常(Checked Exceptions)** - **定义**:必须显式处理的异常(通过 `try-catch` 或 `throws` 声明),否则编译失败。 - **特点**: 1. 继承自 `Exception` 类,但不属于 `RuntimeException` 的子类。 2. 通常表示程序可预见的、可恢复的问题(如文件未找到、网络中断)。 - **常见示例**: - `IOException`(输入输出异常) - `SQLException`(数据库操作异常) - `ClassNotFoundException`(类未找到) - **处理方式**: ```java // 方式1:try-catch捕获 try { FileReader file = new FileReader("test.txt"); } catch (FileNotFoundException e) { System.out.println("文件未找到"); } // 方式2:throws声明向上抛出 public void readFile() throws FileNotFoundException { FileReader file = new FileReader("test.txt"); } ``` --- #### **二、非检查型异常(Unchecked Exceptions)** 无需强制处理,通常由程序逻辑错误导致,编译期不检查。 ##### **1. 运行时异常(RuntimeExceptions)** - **定义**:继承自 `RuntimeException`,由代码逻辑错误引发。 - **特点**: 1. 可避免性(如空指针、数组越界可通过代码检查规避)。 2. 不强制处理,但建议修复代码逻辑。 - **常见示例**: - `NullPointerException`(空指针异常) - `ArrayIndexOutOfBoundsException`(数组越界) - `ArithmeticException`(算术异常,如除以零) - **典型场景**: ```java // 空指针异常 String str = null; System.out.println(str.length()); // 数组越界 int[] arr = {1, 2}; System.out.println(arr[3]); // 算术异常 int a = 5 / 0; ``` ##### **2. 错误(Errors)** - **定义**:继承自 `Error` 类,表示 JVM 或系统级严重问题,程序通常无法恢复。 - **特点**: 1. 不可控性(如内存耗尽、栈溢出)。 2. 不建议捕获处理,需从外部环境或代码优化解决。 - **常见示例**: - `OutOfMemoryError`(内存溢出) - `StackOverflowError`(栈溢出) - `NoClassDefFoundError`(类定义未找到) - **典型场景**: ```java // 栈溢出(递归无终止) public static void infiniteRecursion() { infiniteRecursion(); } // 内存溢出(创建超大对象) List<Object> list = new ArrayList<>(); while (true) { list.add(new Object()); } ``` --- #### **三、自定义异常** - **定义**:用户根据业务需求继承 `Exception` 或 `RuntimeException` 实现的异常。 - **分类依据**: 1. 若需强制处理,继承 `Exception`(检查型异常)。 2. 若为逻辑错误,继承 `RuntimeException`(非检查型异常)。 - **示例**: ```java // 检查型自定义异常 public class InvalidInputException extends Exception { public InvalidInputException(String message) { super(message); } } // 非检查型自定义异常 public class BusinessLogicException extends RuntimeException { public BusinessLogicException(String message) { super(message); } } ``` --- #### **四、对比总结** | **类型** | **检查型异常** | **运行时异常** | **错误(Error)** | |-------------------|---------------------|---------------------|----------------------| | **继承类** | `Exception` | `RuntimeException` | `Error` | | **处理要求** | 必须显式处理 | 无需强制处理 | 无需处理 | | **触发原因** | 外部环境问题 | 代码逻辑错误 | JVM/系统资源问题 | | **恢复可能性** | 较高 | 需修复代码 | 极低 | | **典型示例** | `IOException` | `NullPointerException` | `OutOfMemoryError` | --- #### **五、最佳实践** 1. **优先修复代码逻辑**:避免运行时异常(如判空、校验数组边界)。 2. **合理使用检查型异常**:仅对可恢复问题使用,避免滥用导致代码臃肿。 3. **错误处理**:针对 `Error`,重点优化程序设计和资源管理(如内存泄漏排查)。 4. **自定义异常**:明确业务场景,选择继承 `Exception` 或 `RuntimeException`。 通过理解异常分类,可以更精准地定位问题、设计健壮的代码!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值