class throwseg1
{
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
throwseg1 o1 = new throwseg1();
o1.show3();
}
}
为什么编译器报告方法
show2()
,show3()
和main()
具有当我从这些方法中删除
throws Exception
时? 最佳答案
您可能知道,在Java中,异常可以分为两种:一种需要throws
子句,或者如果您不指定一个则必须处理,而另一种则不需要。现在,请参见下图:
在Java中,您可以抛出任何扩展Throwable
类的内容。但是,您无需为所有类都指定throws
子句。具体地说,是Error
或RuntimeException
或这两个子类中任何一个的类。在您的情况下,Exception
不是Error
或RuntimeException
的子类。因此,它是一个已检查的异常,如果不处理该特定异常,则必须在throws
子句中指定。这就是为什么需要throws
子句的原因。
从Java Tutorial:
现在,如您所知,异常分为两类:已检查和未检查。为什么要进行这些分类?
已检查的异常:它们用于表示可以在程序执行期间恢复的问题。它们通常不是程序员的错。例如,用户指定的文件不可读,或者没有可用的网络连接,等等。在所有这些情况下,我们的程序都不需要退出,而是可以采取措施,例如提醒用户或进入后备状态机制(例如在网络不可用时脱机工作)等
未检查的异常:它们又可以分为两种:错误和RuntimeException。之所以要取消选中它们,原因之一是它们的数量众多,并且要求处理所有这些问题会使我们的程序困惑,并降低其清晰度。另一个原因是:
ArithmeticException
或出现了ArrayIndexOutOfBoundsException
,那是因为我们在编码时不够谨慎。它们之所以发生,通常是因为我们程序逻辑中的某些错误。因此,在我们的程序进入生产模式之前必须清除它们。从某种意义上说,它们不受检查,即程序在发生时必须失败,以便我们的程序员可以在开发和测试时自行解决。 StackOverflowError
,我们的程序将无法做很多事情,例如增加程序的函数调用堆栈的大小。或者,如果出现OutOfMemoryError
,我们将无法做很多事情来增加程序可用的RAM数量。在这种情况下,最好退出程序。这就是为什么使它们不受控制。 有关详细信息,请参阅:
关于java - 为什么在调用函数时需要 “throws Exception”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11589302/