【问题标题】:Why must only certain Exceptions be declared as thrown in method signature为什么必须在方法签名中将某些异常声明为抛出
【发布时间】:2010-09-20 20:27:26
【问题描述】:

当声明一个带有“IllegalAccessException”的方法时,eclipse 迫使我 将方法声明为抛出异常

public void a()  throws IllegalAccessException {
 if(x == 1){
   throw new IllegalAccessException("TEST);
 }
}

在使用“IllegalStateException”的方法 b 中,我不需要将该方法声明为抛出异常

public void b()  {
 if(x == 1){
   throw new IllegalStateException("TEST);
 }
}

你的异常有什么不同
这迫使我声明引发异常的方法 而另一个不是

谢谢你

【问题讨论】:

  • 请注意,IllegalAccessException 不适合您在示例中使用,但IllegalStateException 是合适的。

标签: java exception


【解决方案1】:

因为IllegalAccessException 不是RuntimeException(即是检查异常),而IllegalStateExceptionRuntimeException(即是未检查异常)。

阅读本文了解更多信息:Difference between java.lang.RuntimeException and java.lang.Exception

Oracle 网站上有这个解释:http://download.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

第一种异常是检查异常。这些是编写良好的应用程序应该预料到并从中恢复的特殊情况。例如,假设应用程序提示用户输入文件名,然后通过将名称传递给 java.io.FileReader 的构造函数来打开文件。通常,用户提供现有的可读文件的名称,因此 FileReader 对象的构造成功,应用程序的执行正常进行。但有时用户提供了一个不存在的文件的名称,构造函数会抛出 java.io.FileNotFoundException。一个写得很好的程序会捕捉到这个异常并通知用户错误,可能会提示输入一个更正的文件名。 已检查的异常受 Catch 或 Specify Requirement 的约束。除 Error、RuntimeException 及其子类指示的异常外,所有异常都是已检查异常。

第二种异常是错误。这些是应用程序外部的异常情况,应用程序通常无法预期或从中恢复。例如,假设应用程序成功打开文件进行输入,但由于硬件或系统故障而无法读取该文件。不成功的读取会抛出 java.io.IOError。应用程序可能会选择捕获此异常,以便将问题通知用户 - 但程序打印堆栈跟踪并退出也可能有意义。

错误不受捕获或指定要求的约束。错误是由 Error 及其子类指示的那些异常。

第三种异常是运行时异常。这些是应用程序内部的异常情况,应用程序通常无法预期或从中恢复。这些通常表示编程错误,例如逻辑错误或 API 使用不当。例如,考虑前面描述的将文件名传递给 FileReader 的构造函数的应用程序。如果逻辑错误导致将 null 传递给构造函数,则构造函数将抛出 NullPointerException。应用程序可以捕获此异常,但消除导致异常发生的错误可能更有意义。

运行时异常不受捕获或指定要求的约束。运行时异常是由 RuntimeException 及其子类指示的异常。

【讨论】:

    【解决方案2】:

    IllegalAccessException 是一个检查异常。必须声明或处理已检查的异常,因为它们是操作的预期结果。

    IllegalStateException 是未经检查的异常。未经检查的异常通常被认为是编程错误,并且它不会作为正常程序执行的一部分接收到。当确实发生编程错误时,这些异常默认情况下会打印到标准错误并带有堆栈跟踪,以便开发人员可以确定编程错误是什么。

    【讨论】:

      【解决方案3】:

      正如您在 JDK 的 Javadoc 中看到的,IllegalStateExceptionRuntimeException,而 IllegalAccessException 不是这种情况。

      正如此 Javadoc 所述:

      RuntimeException 是 那些可以抛出的异常 在正常运行期间 Java 虚拟机。

      方法不需要声明 它的 throws 子句的任何子类 可能抛出的 RuntimeException 在方法执行期间,但 没抓到。

      这就解释了差异。

      【讨论】:

        【解决方案4】:

        Java 设计的一部分是一些异常需要“抛出”声明,而另一些则不需要。那些不被称为“运行时异常”并且源自“RuntimException”。 IllegalAccessException 不是运行时异常,IllegalStateException 是。

        差异背后的逻辑是,一般异常适用于随时可能发生的异常情况,无论程序员做什么,如果程序员希望他们的代码被拒绝,则应始终由他们处理。 IllegalAccessException 或 IO Excection 可能是由程序员无法控制的硬件故障或访问权限引起的。当它们发生时,软件需要做一些事情,并且有一个 throws 子句迫使程序员考虑要做什么。 IllegalStateException 是某种程序员错误的症状,因此不一定需要处理。

        【讨论】:

          猜你喜欢
          • 2012-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多