为什么不需要在编译时捕获RunTimeExceptions

时间:2011-02-01 12:01:06

标签: java

需要捕获或声明在编译时抛出已检查的异常,但运行时异常不需要...为什么我们只重要检查异常......

8 个答案:

答案 0 :(得分:10)

在Java中,该语言的原始发明者希望区分可能在程序中出现的常见异常类型。他们想出了这三种类型:

  • 已检查的异常用于错误,这些错误可能在运行时发生,并且是预期的(有点),例如IOException。例如,在执行文件或网络I / O时,可能会在任何时候发生错误(磁盘已满,连接丢失等)。程序员必须知道,任何被调用的操作都可能随时失败,因此,语言通过强迫程序员对异常做一些事情来强制执行这种意识。

  • 未经检查的异常用于编程错误,例如NullPointerExceptionIllegalArgumentException等。这些错误通常是程序员监督的结果,并构成程序中的错误。它们不应该由代码的大多数部分处理,因为关于状态的所有保证,程序当前处于其中并且其一致性已经消失。运行时异常的一个突出特点是,意外(你真的不希望程序中出现错误,对吧? - 除了一般级别的“当然,我不打赌我的生活在这个程序上没有错误”)

  • 错误,几乎无法进行恢复,例如OutOfMemoryErrorAssertionError等。这些异常非常糟糕。这些人通常永远不会被处理,如果他们发生,将导致程序崩溃。

当然,在实践中,许多应用程序将处理运行时异常(至少通过记录它们),甚至是Error。像Spring这样的框架无论如何都会使所有异常都未经检查(即运行时异常),从而进一步模糊这种区别。有趣的是,已检查的异常被认为包含在C#中并被省略,因为它们给程序员增加了沉重的负担。即使在今天,关于该主题的意见也各不相同。

答案 1 :(得分:2)

取自http://en.wikipedia.org/wiki/Exception_handling

  

未经检查的异常类型不应该   处理除外,考虑到   在最外层的范围。   这些通常代表那些情景   不允许恢复:   RuntimeExceptions经常反映出来   编程缺陷,[19]和错误   通常表示不可恢复的JVM   故障。观点是,即使在一个   支持检查的语言   例外情况,有的情况下   使用已检查的异常不是   适当

显然提到它代表不允许恢复的方案

答案 2 :(得分:2)

该部门为您提供了灵活性:在考虑抛出什么类型的异常时,只有当应用程序可以合理地从它们中恢复时才应该抛出已检查的异常(例如:“无法写入文件”很少是崩溃的理由;相反,让我们向用户显示一条消息)。运行时异常应该是致命的(编程错误),因此最好让程序立即崩溃。

这应该是一个好主意。但它在实践中太复杂了。核心问题是库和语言设计者应该决定什么样的错误对于应用程序是致命的(当时甚至不存在!)。

您知道虽然1 / 0会产生ArithmeticException,但1.0 / 0是完全合法的Infinity吗?显而易见 - 或者不......并且java.text.Format应该将任意对象转换为String,但由于某种原因,如果要转换的对象是,则会抛出未经检查的异常(IllegalArgumentException)某种程度上错误的类型(例如null),所以在实践中,每当你使用Format时,你必须记住来编写try-catch块。显然有人认为将空值转换为字符串是一个致命的编程错误。我宁愿返回一个空字符串。你的旅费可能会改变。 JDK充满了这种奇怪的选择,它清楚地显示了在已检查与未检查之间进行选择的问题。

这个问题让很多人只提倡未经检查的例外。我觉得这很傻;大多数例外应该得到照顾,因为它们表明重要的事情。如果我是一名语言设计师,我会检查所有异常,但不是try-catch -block,而是可以使用普通的注释来说“我不关心这个异常”(这实质上会转换那个检查过的异常)进入运行时异常)。这将带来已检查异常的好处(除非明确告知,否则不会被忽视)和未经检查的异常的好处(没有重的try-catch阻塞所有)。这将是应用程序员的决定,决定什么是致命的和预期的。

当然,如果您愿意,可以捕获运行时异常。简单catch(Exception ex)就可以了。

答案 3 :(得分:1)

查看异常“RunTime”的名称。

在编译时,编译器可以确切地看到大部分代码可能出错的地方和位置。

但是,某些对象/值只能在运行时进行评估,遗憾的是编译器无法预见到这一点。

e.g。将对象转换为int,当它实际上是一个字符串时。您只能在运行时确定它。因此会抛出运行时异常

答案 4 :(得分:1)

查看常见的RuntimeExceptions:

  • ArithmeticException
  • ArrayIndexOutOfBoundsException异常
  • ClassCastException异常
  • 的EmptyStackException
  • 抛出:IllegalArgumentException
  • 抛出:IllegalMonitorStateException
  • 的NullPointerException
  • UnsupportedOperationException异常

实际上说:大多数异常都可以在任何地方发生,并且最有可能是程序员错误,因此只需要在某种错误报告处理程序中处理。其他异常显示JVM的环境存在问题,需要进行处理,因为不能保证不会被程序单独抛出。

答案 5 :(得分:1)

如果在运行时发生异常,则JVM立即创建异常对象,并在控制台上打印该对象消息。

unchecked exceptions are occurred due to poor logic of our program.so program will be terminated abnormally.but JVM will not be halted.so JVM creates Excpetion object.

如果我们考虑检查异常,例如,如果我们想要将一些外部文件加载到我们的程序中,JVM负责那个。所以,如果在加载该文件时发生任何问题,那么JVM将被停止.so,那么谁创建了异常对象。这是检查过的删除问题。

要解决上述问题,我们必须使用throws关键字在编译时处理已检查的排除。

如果处理检查异常,则完成以下操作 - JVM执行逐个语句,当它识别出throws关键字后跟检查异常时,它会创建检查异常对象。因此,当发生异常时,已经创建的异常对象用于在控制台上打印异常信息。

答案 6 :(得分:0)

    When you can handle the recovery of the state of Object , go for Checked Exception.
    When you cannot handle the recovery go for UnCheckedException.
    Mostly API developers go for Runtime Exception , 
   they do not want to enforce handling exception by the user, 
   since they themselves do not know how to handle it

答案 7 :(得分:0)

运行时异常可以发生在程序的任何地方,而在典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求您捕获或指定运行时异常(尽管可以)。