Java 选中与未选中异常

Java 选中与未选中异常,java,exception,runtimeexception,checked-exceptions,Java,Exception,Runtimeexception,Checked Exceptions,我已经研究过:但是,对于未检查的异常,编译器不会强制客户机程序员捕获异常或在throws子句中声明它。事实上,客户机程序员甚至可能不知道异常可能被抛出。例如,String的charAt()方法引发的StringIndexOutOfBoundsException 这是什么意思 根据该代码,不需要在代码中放入try-catch块, 但我看到编译器强制将代码放入try-catch块 我很困惑它们到底是什么?你的问题到底是什么? 编译器不应该(也不会)强制您尝试/捕获未检查的异常,这与它们的实际情况背道

我已经研究过:但是,对于未检查的异常,编译器不会强制客户机程序员捕获异常或在throws子句中声明它。事实上,客户机程序员甚至可能不知道异常可能被抛出。例如,String的
charAt()
方法引发的
StringIndexOutOfBoundsException

这是什么意思

根据该代码,不需要在代码中放入try-catch块, 但我看到编译器强制将代码放入try-catch块


我很困惑它们到底是什么?

你的问题到底是什么? 编译器不应该(也不会)强制您尝试/捕获未检查的异常,这与它们的实际情况背道而驰

一般的想法是,检查异常是您可以预见的事情,但可能基于您无法控制的输入,并且您必须处理。 未检查的异常通常表示程序中的错误


有许多人认为,在Java平台中,检查异常是一个错误,他们只是非常谨慎地使用它们,或者根本不使用它们。您可以通过搜索google了解更多关于这场辩论的信息。

未检查的异常是那些扩展了
RuntimeException
类的异常。编译器不会强迫您捕获此类异常,也不会强迫您使用
throws
关键字在方法中声明它。检查所有其他异常类型(不扩展
RuntimeException
),因此必须声明为抛出和/或捕获

当您希望方法的调用方(即API的用户)显式处理API中的异常情况时,将使用选中的异常。当您认为调用将能够对该异常情况执行有意义的操作时,会声明选中的异常,例如重试调用、回滚更改或将其转换为用户可读的错误消息

如果您认为调用对异常没有任何用处(特别是当它表示错误或API使用错误时),那么应该取消检查异常。此外,一个包含太多已检查异常的API可能会让编程感到恼火(例如,尝试使用java reflection API=)

这是因为

  • 未经检查的异常不是程序员错误的结果。相反,它们是严重的后果,我们(程序员)不希望对此做太多
  • 在检查异常的情况下,它是由于程序员的错误而生成的异常&通常可以由程序员自己解决 查看以下链接:


    • 检查异常对于处理程序正常操作中发生的事件非常有用。例如,当文件无法打开时抛出的
      IOException
      。即使程序没有问题,也会发生这些异常。因此,有必要告诉程序如何处理异常
    • 未检查的异常有助于识别代码中的缺陷。例如,当在
      null
      对象上读取值时,会引发
      NullPointerException
      。因此,未检查的异常表示需要程序员手动修复的问题。为了避免错误行为,程序崩溃是合理的,因此不需要try-catch块(但为了提供缓解,例如向用户显示错误,可能需要try-catch块)
    **已检查异常 在编写代码期间要检查、处理或应注意的异常称为检查异常。 例如: 1.我们有FileNotFoundException-->当我们编写一些与文件类相关的代码时,会发生这种情况。文件不存在的防卫可能性。在这种情况下,为了处理这些异常,我们必须确定地处理这些异常。 2.另一个例子是ParseException,它将在我们处理日期函数时发生

    未检查的异常 这些是在编码期间可选处理的异常。这取决于我们是否处理它们。如果我们不能处理它们,那么在执行过程中就有可能出现运行时错误。 例如:
    我们有一种叫做NullPointerException、算术异常、NosSuchElementFoundException等。这些都是可选的,我们甚至不需要处理它们。甚至jvm或编译器也不建议我们处理它们。**

    所有异常都是运行时的一部分,而不是编译时。异常有两种:已检查异常和未检查异常。已检查异常的示例为IO异常、ClassNotFound异常,未检查异常的示例为运行时异常。在检查异常的情况下,错误或警告消息在编译时出现,因此用户将在运行时使用throws关键字来处理它,该关键字用于向默认捕获机制系统抛出异常。但在未检查的异常情况下,编译时不存在警告。

    简单地说

    • 检查异常是那些可以并且应该由代码处理的异常(因此编译器强制您处理它们)
    • 未检查的异常是程序员无法控制的异常(因此编译器不会强制您处理它们)

    即使在创建自定义异常时也要使用相同的规则。

    从“Error”扩展的异常也会被取消选中。反之亦然。当一个expetion是程序员的错误时,它应该被取消选中。捕捉一个bug而不是修复它是毫无意义的。如果不是程序员的错误,而是由外部参数(例如网络错误)引起的,则应进行检查。误导!有足够代表性的人可以编辑请修复这个问题吗?我已经提交了一个更正,它是