请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

本文深入解析Java中的Exception和Error的区别,探讨了它们在程序运行中的角色。从异常处理的角度出发,介绍了异常处理的基本语法和最佳实践,帮助读者理解何时应该捕获异常,何时则应让异常自由传播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考点分析:

分析 Exception 和 Error 的区别,是从概念角度考察了 Java 处理机制。总的来说,还处于理解的层面,面试者只要阐述清楚就好了。

我们在日常编程中,如何处理好异常是比较考验功底的,我觉得需要掌握两个方面。

第一,理解 Throwable、Exception、Error 的设计和分类。 比如,掌握那些应用最为广泛的子类,以及如何自定义异常等。

很多面试官会进一步追问一些细节,比如,你了解哪些 Error、Exception 或者 RuntimeException?我画了一个简单的类图,并列出来典型例子,可以给你作为参考,至少做到基本心里有数。

在这里插入图片描述

第二,理解 Java 语言中操作 Throwable 的元素和实践。 掌握最基本的语法是必须的,如 try-catch-finally 块,throw、throws 关键字等。与此同时,也要懂得如何处理典型场景。

典型回答:

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。点击这里看一下壮烈牺牲的阿里巴巴面试经验。

Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。

Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。

不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

回答二:
java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

### Java 中自定义异常的概念 在 Java 编程中,当内置的异常类无法满足特定需求,可以通过继承 `Exception` 或 `RuntimeException` 来创建自定义异常类[^2]。通常情况下,自定义异常需要提供两个构造方法:一个是无参数的构造方法,另一个是带有异常信息字符串的构造方法。 以下是实现自定义异常的一个简单例子: ```java // 定义一个自定义异常类 public class MyCustomException extends Exception { // 无参构造方法 public MyCustomException() { super(); } // 带有异常信息的构造方法 public MyCustomException(String message) { super(message); } } ``` 通过这种方式,开发者可以根据业务逻辑的需求抛出自定义异常并对其进行处理[^1]。 --- ### Error Exception区别及用法 #### 1. **Error** `Error` 是指 JVM(Java 虚拟机)运行过程中发生的严重问题,通常是不可恢复的情况。这些问题超出了应用程序的控制范围,因此一般不需要也不应该被捕获或处理。常见的 `Error` 类型包括但不限于以下几种: - `OutOfMemoryError`: 表示内存不足。 - `StackOverflowError`: 表示堆栈溢出。 由于这些错误是由外部环境引起的,并且几乎不可能由程序修复,所以在设计应用很少考虑捕获它们[^3]。 #### 2. **Exception** `Exception` 则表示程序执行期间可能出现的各种意外情况,这类问题是可以通过编写代码来预防或者解决的。根据是否强制要求处理,`Exception` 可分为两大类: - **Checked (受检) Exceptions**: 这些异常必须显式声明 (`throws`) 并在其调用处进行处理(要么捕获,要么继续向上抛)。例如 `IOException`, `SQLException` 等都属于此类。 - **Unchecked (非受检) Exceptions**: 即运行异常(`RuntimeException`)及其子类,比如 `NullPointerException`, `ArrayIndexOutOfBoundsException` 等。对于这种类型的异常,编译器不会强迫开发人员去处理,但如果发生则可能导致程序崩溃[^4]。 下面是一个简单的对比表: | 特性 | Error | Checked Exception | Unchecked Exception | |-----------------|--------------------------------|----------------------------------|--------------------------------| | 继承关系 | java.lang.Throwable | java.lang.Exception | java.lang.RuntimeException | | 是否可恢复 | 不可恢复 | 大多可通过修改输入等方式恢复 | 部分可能恢复 | | 使用场景 | 系统级致命错误 | 方法间传递数据失败等情况 | 编码失误引起的小概率事件 | --- ### 总结 综上所述,在实际开发工作中合理运用自定义异常能够显著提高系统的健壮性用户体验;而理解清楚 `Error` `Exception` 的差异有助于更精准地定位问题根源以及采取恰当措施应对不同种类的问题^. ```java try{ throw new MyCustomException("This is a custom exception."); }catch(MyCustomException e){ System.out.println(e.getMessage()); } ``` 上述代码片段展示了如何手动触发并捕捉到之前定义好的自定义异常实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值