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

时间:2012-02-21 03:21:38

标签: c# java exception

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

4 个答案:

答案 0 :(得分:55)

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

在Java中,已检查的例外是Throwable,而不是RuntimeExceptionError或其中一个子类。

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

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

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

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

答案 1 :(得分:6)

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

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

希望这有帮助。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:-3)

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

检查异常是Java语言设计中的一个错误。期。每当你发现一个检查过的异常将它们包装在一个未经检查的异常中(可能是一个RuntimeException)。

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

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

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

作为参考:由Java和Scala专家开发的Kotlin和stackoverflow surveys中的一个最受欢迎的语言)完全删除了检查的异常。更多信息请访问:2