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子句。具体地说,是ErrorRuntimeException或这两个子类中任何一个的类。在您的情况下,Exception不是ErrorRuntimeException的子类。因此,它是一个已检查的异常,如果不处理该特定异常,则必须在throws子句中指定。这就是为什么需要throws子句的原因。

Java Tutorial:



现在,如您所知,异常分为两类:已检查和未检查。为什么要进行这些分类?

已检查的异常:它们用于表示可以在程序执行期间恢复的问题。它们通常不是程序员的错。例如,用户指定的文件不可读,或者没有可用的网络连接,等等。在所有这些情况下,我们的程序都不需要退出,而是可以采取措施,例如提醒用户或进入后备状态机制(例如在网络不可用时脱机工作)等

未检查的异常:它们又可以分为两种:错误和RuntimeException。之所以要取消选中它们,原因之一是它们的数量众多,并且要求处理所有这些问题会使我们的程序困惑,并降低其清晰度。另一个原因是:

  • 运行时异常:它们通常是由于程序员的错误而发生的。例如,如果出现了被零除的ArithmeticException或出现了ArrayIndexOutOfBoundsException,那是因为我们在编码时不够谨慎。它们之所以发生,通常是因为我们程序逻辑中的某些错误。因此,在我们的程序进入生产模式之前必须清除它们。从某种意义上说,它们不受检查,即程序在发生时必须失败,以便我们的程序员可以在开发和测试时自行解决。
  • 错误:错误是通常无法从中恢复程序的情况。例如,如果出现StackOverflowError,我们的程序将无法做很多事情,例如增加程序的函数调用堆栈的大小。或者,如果出现OutOfMemoryError,我们将无法做很多事情来增加程序可用的RAM数量。在这种情况下,最好退出程序。这就是为什么使它们不受控制。

  • 有关详细信息,请参阅:
  • Unchecked Exceptions — The Controversy
  • The Catch or Specify Requirement
  • 关于java - 为什么在调用函数时需要 “throws Exception”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11589302/

    10-10 06:15