请解释Java中的RuntimeException以及它应该在何处使用

我在SO上进行了这个很棒的讨论,标题为:The case against checked exceptions,但是我无法遵循应该使用RuntimeException的地方以及它与普通Exceptions及其子类的不同之处.谷歌搜索给了我一个复杂的答案,也就是说,它应该用于处理编程逻辑错误,并且应该在没有正常情况发生时抛出,例如在switch-case结构的默认块中.

你能否在这里详细解释一下RuntimeException.谢谢.

解决方法:

I am unable to follow where exactly
RuntimeException should be used

这可能是因为你正在寻找一个论点,即人们对这一点的看法不一致.

and
how it is different from normal
Exceptions and its subclasses.

非常简单:检查Exception的所有子类(RuntimeException及其子类除外),即编译器将拒绝您捕获的代码unelss或在方法签名中声明它们.但是,未选中RuntimeException的子类.

Googling gave me a complex answer,
that is, it should be used to deal
with programming logic errors and
should be thrown when no Exception
should normally occur, such as in the
default block of switch-case
construct.

这是传统的智慧,它表示对于程序可以有效处理的所有内容,您应该使用已检查的异常,因为编译器会强制您处理它们.相反,程序通常不能有效地处理程序员错误,因此不必检查它们.这就是Java Standard API使用RuntimeException的方式.

您链接的讨论是由一些人(包括我)认为检查异常会导致错误代码而不应该使用的.由于无法在编译器中禁用异常检查,因此执行此操作的唯一方法是仅使用RuntimeException及其子类.

IMO支持这种观点的一个观察是,“仅针对程序员错误使用未经检查的异常”的传统观点实际上主要是向后推理的合理化:没有代码安全性原因,编译器不应该强迫您处理程序员错误.但是,像NullPointerException和ArrayIndexOutOfBoundsException这样的东西几乎可以在任何地方出现,如果这些被检查过,没有人会想要用Java编程.因此,语言设计者必须为这些做出一个例外,并使它们不受限制.为了解释这一点,他们提出了“未经检查的例程是针对程序员错误”的故事.

上一篇:何时引发java.lang.EnumConstantNotPresentException?


下一篇:java – Runtim Exception扩展Exception和自定义异常从Exception扩展为什么后一个是编译时异常而另一个不是?