为什么必须在方法签名中仅声明某些异常被抛出

sha*_*hay 2 java exception

当使用"IllegalAccessException"声明方法时,eclipse强制我将该方法声明为抛出异常

public void a()  throws IllegalAccessException {
 if(x == 1){
   throw new IllegalAccessException("TEST);
 }
}
Run Code Online (Sandbox Code Playgroud)

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

public void b()  {
 if(x == 1){
   throw new IllegalStateException("TEST);
 }
}
Run Code Online (Sandbox Code Playgroud)


一个强制我声明抛出异常的方法而另一个异常的异常之间有什么不同

谢谢

nan*_*nda 11

因为IllegalAccessException不是RuntimeException(即检查异常)并且IllegalStateExceptionRuntimeException(即未经检查的异常).

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

关于Oracle(duh!)网站的这个解释: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.应用程序可能会选择捕获此异常,以便通知用户该问题 - 但它也可能有助于程序打印堆栈跟踪并退出.

错误不受Catch或Specify Requirement的约束.错误是Error及其子类指示的异常.

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

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