Java / C#中检查的exception是什么?

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

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

在Java中,已检查的exception是Throwable ,它们不是RuntimeExceptionError或其子类之一。

Java设计人员认为他们需要确保程序处理合理可能的exception。 一个典型的例子是IOException 。 只要程序执行I / O,就有可能出现故障。 磁盘可能已满,文件可能不存在,可能存在权限问题等。

因此,Java的设计使得程序必须以某种方式在语法上处理exception。 这可能是一个catch块,或者以某种方式重新抛出exception。

C#没有检查exception。 他们决定将此问题留给应用程序开发人员( 面试 )。 检查的exception是有争议的,因为它们可以使代码冗长,而开发人员有时会使用空的catch块来处理它们。 此外,它可以是任意标准库方法抛出已检查的exception。 例如,为什么File.delete (新的Java 7 API以不同方式执行此操作)抛出IOException

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

在Java中,一个经过检查的exception (正如Matthew Flaschen正确指出的那样)是编译器要求您处理的exception。 这些是在函数定义上声明的exception(例如, function bob() throws ImNotBobException { ... }来表示调用该函数可能抛出该exception – 例如,在解析整数时为NumberFormatException ,或在写入文件时为IOException

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

希望这可以帮助。

检查exception是需要任何“消费”类必须编写显式检查(并希望处理)exception的代码的exception。

例如,如果Apple类具有包含WormFound的已检查exception的Eat()方法,那么调用该方法的任何代码都需要显式地具有该exception的catch。

作为旁注,它是Java的特征,而不是C#的特征。

(在创建C#时,在C#团队眼中,检查exception的优点并不那么明显,因此不包括在内。)

(几年后,通过谷歌航空公司抵达这里的人)

检查exception是Java语言设计中的一个错误。 期。 每当您发现已检查的exception时,都会将它们包装在未经检查的exception中(可能是RuntimeException)。

不幸的是,由于营销问题,首先是Sun,然后Oracle无法公开承认他们的错误。

在创建Java时,exception处理尚不清楚。 Java设计者天真地认为,迫使开发人员在编译时检查exception是一个好主意。 虽然这看起来直观正确,但这变成了反模式,类似于使用“GOTO”。 它从未在实践中起作用并导致许多问题。 必须在“主循环”或“控制器”中处理exception,否则,如果它们能够在引发错误的函数内处理,则它们不会是例外,而是必须由支持的预期错误。正常的API返回值。 本质上的例外是未考虑的事情,并且不允许代码的正常流程执行。

例如,Spring是企业应用程序开发的“标准”Java框架,它仅限于将已检查的exception包装到未经检查的exception中。

C#解决了这个问题。 实际上,C#没有这个问题。

Kotlin(“Java ++”)不使用已检查的exception