为什么只能在方法签名中声明某些exception被抛出

当使用“IllegalAccessException”声明方法时,eclipse强制我将该方法声明为抛出exception

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

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

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

什么是exception之间的差异
那个强迫我声明抛出exception的方法而另一个不是

谢谢

因为IllegalAccessException不是RuntimeException (即被检查exception)而IllegalStateExceptionRuntimeException (即未经检查的exception)。

阅读本文以获取更多信息: java.lang.RuntimeException和java.lang.Exception之间的区别

关于Oracle(duh!)网站的这个解释: http : //download.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

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

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

错误不受Catch或Specify Requirement的约束 。 错误是Error及其子类指示的exception。

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

运行时exception不受Catch或Specify Requirement的约束 。 运行时exception是RuntimeException及其子类指示的exception。

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

IllegalStateException是未经检查的exception。 未经检查的exception通常被视为编程错误,并且预计不会在正常程序执行过程中收到exception。 当发生编程错误时,默认情况下会使用堆栈跟踪将这些exception打印到标准错误,以便开发人员可以确定编程错误是什么。

正如你在JDK的Javadoc中看到的那样, IllegalStateException是一个RuntimeException ,它不是IllegalAccessException的情况。

正如这个Javadoc所说:

RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些exception的超类。

不需要方法在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未捕获。

这解释了差异。

它是Java设计的一部分,有些exception需要’抛出’声明,有些则不需要。 那些没有的被称为“运行时exception”并从“RuntimException”下降。 IllegalAccessException不是运行时exception,而IllegalStateException是。

差异背后的逻辑是,一般exception是针对可能在任何时间发生的exception情况,无论程序员做什么,并且如果程序员希望他们的代码是反叛的话,应该始终由程序员处理。 IllegalAccessException或IO Excection可能是由程序员控制之外的硬件或访问权限故障引起的。 软件在发生时需要做一些事情,并且有一个throws子句迫使程序员思考要做什么。 IllegalStateException是某种程序员错误的症状,因此不一定需要处理。