Java 运行时异常&;错误

Java 运行时异常&;错误,java,runtime-error,runtimeexception,Java,Runtime Error,Runtimeexception,在异常层次结构中 这些是运行时异常/错误 两者之间的区别是:那些在 由编程/设计不当引起的,以及 那些不能/不应该由开发人员控制的 用于在应用程序中编码异常, 例如,要在业务逻辑中发生某些情况时引发异常, 这是延长的 问题是,扩展和扩展之间到底有什么区别 还有延伸,除了延伸 是错误的做法吗?错误和运行时异常都是未检查的异常,这意味着它表明程序存在缺陷,通常不应被捕获。(NullPointerException,IndexOutOfBoundsException等) 我认为两者之间的主要区别在于R

在异常层次结构中 这些是运行时异常/错误

两者之间的区别是:那些在 由编程/设计不当引起的,以及 那些不能/不应该由开发人员控制的

用于在应用程序中编码异常, 例如,要在业务逻辑中发生某些情况时引发异常, 这是延长的

问题是,扩展和扩展之间到底有什么区别 还有延伸,除了延伸
是错误的做法吗?

错误和运行时异常都是未检查的异常,这意味着它表明程序存在缺陷,通常不应被捕获。(
NullPointerException
IndexOutOfBoundsException
等)

我认为两者之间的主要区别在于
RuntimeException
表明程序存在错误,
错误是致命的,但程序无法控制。(
OutOfMemorryError
ThreadDeath
等)

因此
错误子类化是不好的做法,因为错误通常不是程序在运行时可以修复的。在程序中,如果需要抛出某些内容,请使用
异常

问题是,扩展和 RuntimeException和扩展错误——除了扩展错误是 坏习惯

你已经提到了主要的区别。对于
错误
,它表示

Error
是所有异常的超类,普通 通常不希望程序恢复

对于
运行时异常
,它声明

RuntimeException
是Exception的一个直接子类。
RuntimeException
是所有可能发生的异常的超类 在表达式求值期间由于多种原因抛出,但从中 恢复仍有可能

你应该从这些引语中得到的是你通常会看到的

try {
   ...
} catch (Exception e) { // catches RuntimeException
   ...
}
因为
Exception
RuntimeException
的一种超级类型,所以它是一种包罗万象的情况。但你几乎永远也看不到(我从来没见过)


谁说这是坏习惯?当然不是你每天都会做的事情,但我不怀疑在某些情况下这是值得的。@HotLicks Joshua Bloch在他的书《有效的Java:“虽然Java语言规范不需要它,但有一个强大的约定,即JVM保留错误以指示资源不足、不变故障或其他导致无法继续执行的情况。鉴于此约定几乎被普遍接受,最好不要实现任何新的错误子类。因此,您实现的所有未经检查的一次性文件都应该是
RuntimeException
(直接或间接)的子类。“@alfasin-那么XYZ操作系统在检索系统时钟时可能会检测到硬件故障,但它不应该称之为错误?控制化工厂阀门的API可能检测到硬件故障,因此不应再次将其称为错误?@HotLicks在同一章中,Joshua说
RuntimeException
应指示“编程错误”,例如,调用方法时的无效前置条件。您描述的特定情况(硬件故障)可能会导致JVM崩溃(在这种情况下,将引发
错误
),但无论如何,它听起来不像是“编程错误”。我想答案取决于这样一个问题将如何影响您的程序/操作系统。重要的是要记住,
RuntimeException
Error
之间没有行为上的差异-只有语义上的差异,这就是为什么
RuntimeException
可能仍然适用的原因。@Hot-Licks这个约定,就像任何约定一样,是任意的。我把我认为应该回答你问题的部分加粗了。运行时程序无法修复的其他部分是代码中的bug。因此,断言异常可以合法地子类
Error
(或者更好的是,
AssertionError
,它是
Error
子类)。
try {
   ...
} catch (Error e) {
   ...
}