Java 将异常标记为选中或未选中的条件是什么?例如:IllegalArgumentException未选中,但IOException未选中

Java 将异常标记为选中或未选中的条件是什么?例如:IllegalArgumentException未选中,但IOException未选中,java,exception,Java,Exception,我很好奇,为什么某些异常属于检查异常类别,而其他异常属于另一个类别? 我知道编译时错误(语法错误等-这是直观和可理解的)和运行时错误(空指针异常等)之间的基本区别。 但我更喜欢更详细的分析,比如如何检测编译时错误,以及为什么IO异常会在编译时发生,因为输入和输出只是在运行时才会出现? 还检测到一些关于非法参数异常的讨论?我认为没有规则。在过去,检查异常是一种方式,但今天人们更喜欢未检查异常。你可能会在网上找到很多关于这个话题的讨论。您可以将选中的异常视为:“您确实需要在这里处理此问题,否则情况会

我很好奇,为什么某些异常属于检查异常类别,而其他异常属于另一个类别? 我知道编译时错误(语法错误等-这是直观和可理解的)和运行时错误(空指针异常等)之间的基本区别。 但我更喜欢更详细的分析,比如如何检测编译时错误,以及为什么IO异常会在编译时发生,因为输入和输出只是在运行时才会出现?
还检测到一些关于非法参数异常的讨论?

我认为没有规则。在过去,检查异常是一种方式,但今天人们更喜欢未检查异常。你可能会在网上找到很多关于这个话题的讨论。您可以将选中的异常视为:“您确实需要在这里处理此问题,否则情况会变得非常糟糕”。就我个人而言,如果我需要进一步处理应用程序堆栈,我通常会将选中的异常转换为未选中的异常。

我认为没有规则。在过去,检查异常是一种方式,但今天人们更喜欢未检查异常。你可能会在网上找到很多关于这个话题的讨论。您可以将选中的异常视为:“您确实需要在这里处理此问题,否则情况会变得非常糟糕”。就我个人而言,如果我需要进一步处理应用程序堆栈,我通常会将检查过的异常转换为未检查过的异常。

在核心部分,“检查过的”异常通常是由外部源引起的,例如,
IOException
(因此在编译时),而“运行时”异常可能会发生,通常依赖于变量(可以在运行时更改)。程序员有责任防止所有运行时异常(检查null、检查索引等),而检查的异常可能是由重命名/删除文件等引起的。这两者有很多重叠,因此无法定义特定的“边界”

有些异常被决定标记为运行时,因为每次强制程序员捕获并处理它们会使代码过于混乱。检查过的异常通常不会经常发生,但当它们发生时,需要相应地处理(在finally块中关闭文件等)

我不相信有一个明确的规则将两者分开,但它背后肯定有相当多的过程。

在核心,一个“已检查”的异常通常是由外部源引起的,例如,
IOException
(因此在编译时),而一个“运行时”异常可能会发生,通常依赖于变量(可以在运行时更改)。程序员有责任防止所有运行时异常(检查null、检查索引等),而检查的异常可能是由重命名/删除文件等引起的。这两者有很多重叠,因此无法定义特定的“边界”

有些异常被决定标记为运行时,因为每次强制程序员捕获并处理它们会使代码过于混乱。检查过的异常通常不会经常发生,但当它们发生时,需要相应地处理(在finally块中关闭文件等)

我不相信有一个明确的规则将两者区分开来,但在这背后肯定有相当多的过程

IllegalArgumentException是如何成为运行时异常的 是否为选中的异常

这是因为
IllegalArgumentException扩展了RuntimeException
(称为未检查的异常或运行时异常),而
IOException扩展了异常
(称为已检查的异常)

换句话说,如果从方法或代码块中抛出任何异常对象(类型为
java.lang.exception
),则将在编译时对其进行验证,而如果异常对象类型为
RuntimeException
,则不会在编译时对其进行验证,即,只有在实际执行期间才知道它(运行时)程序的

另外,请注意,检查的异常用于编译时验证(即,我们可以通过捕获异常来提供恢复机制)编译器确保使用
throws
关键字抛出所有选中的异常,或者使用
catch
捕获所有选中的异常,即catch或Specify,您可以查看

IllegalArgumentException是如何成为运行时异常的 是否为选中的异常

这是因为
IllegalArgumentException扩展了RuntimeException
(称为未检查的异常或运行时异常),而
IOException扩展了异常
(称为已检查的异常)

换句话说,如果从方法或代码块中抛出任何异常对象(类型为
java.lang.exception
),则将在编译时对其进行验证,而如果异常对象类型为
RuntimeException
,则不会在编译时对其进行验证,即,只有在实际执行期间才知道它(运行时)程序的


另外,请注意,检查的异常用于编译时验证(即,我们可以通过捕获异常来提供恢复机制)编译器确保使用
throws
关键字抛出所有已检查的异常,或者使用
catch
捕获所有已检查的异常,即catch或Specify,您可以查看。

具体来说,取消选中IllegalArgumentException是有意义的,因为它是在大量核心Java API中抛出的。如果一个异常几乎到处抛出,那么将其选中是没有好处的。

指定