Java 将异常标记为选中或未选中的条件是什么?例如:IllegalArgumentException未选中,但IOException未选中
我很好奇,为什么某些异常属于检查异常类别,而其他异常属于另一个类别? 我知道编译时错误(语法错误等-这是直观和可理解的)和运行时错误(空指针异常等)之间的基本区别。 但我更喜欢更详细的分析,比如如何检测编译时错误,以及为什么IO异常会在编译时发生,因为输入和输出只是在运行时才会出现?Java 将异常标记为选中或未选中的条件是什么?例如:IllegalArgumentException未选中,但IOException未选中,java,exception,Java,Exception,我很好奇,为什么某些异常属于检查异常类别,而其他异常属于另一个类别? 我知道编译时错误(语法错误等-这是直观和可理解的)和运行时错误(空指针异常等)之间的基本区别。 但我更喜欢更详细的分析,比如如何检测编译时错误,以及为什么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中抛出的。如果一个异常几乎到处抛出,那么将其选中是没有好处的。指定