Java/C# 中有哪些已检查的异常?

2022-09-01 04:20:19

我是一名C#开发人员,偶尔用Java进行编码。有人可以用简单的术语解释Java中检查的异常是什么,为什么需要它吗?在 C# 中没有遇到过这个术语。


答案 1

已检查的异常是编译器要求您以某种方式处理的异常。

在 Java 中,选中的异常是可抛出的,它们不是 RuntimeExceptionError 或其子类之一。

Java设计人员认为他们需要确保程序处理合理可能的异常。一个典型的例子是IOException。每当程序执行 I/O 操作时,都有可能失败。磁盘可能已满,文件可能不存在,可能存在权限问题等。

因此,Java被设计为程序必须以某种方式在语法上处理异常。这可能是通过捕获块,或者以某种方式重新抛出异常。

C# 没有选中的异常。他们决定将此问题留给应用程序开发人员(访谈)。检查的异常是有争议的,因为它们可以使代码冗长,而开发人员有时会使用空的 catch 块来轻松处理它们。此外,可以任意地将哪些标准库方法抛出已检查的异常。例如,为什么File.delete(一个新的Java 7 API以不同的方式做到这一点)不抛出?IOException

Hejlsberg在那次采访中指出的另一个问题是可版本性。将已检验的异常添加到子句中会强制修改和重新编译使用该方法的所有代码。throw


答案 2

在Java中,检查异常(正如Matthew Flaschen正确指出的那样)是编译器要求您处理的异常。这些是在函数定义上声明的异常(例如 说调用该函数可能会引发该异常 - 例如 解析整数或写入文件时。function bob() throws ImNotBobException { ... }NumberFormatExceptionIOException

但是,某些异常可能会从未知或意外的位置引发,这些异常在每个级别上处理都是不切实际的,因此编译器不需要您处理这些异常。这些是未经检查的例外。它们可以从不声明抛出它们的各个地方抛出(通常是通过在对象尚未初始化时尝试调用对象上的方法,即为空 - 这将导致.)NullPointerException

希望这有帮助。