49
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

+2

@PaulTomblin主要肯定可以声明抛出异常。如果有,JVM将关闭。这与编译器允许的那样接近忽略它。 – Taymon 2012-07-21 03:57:35

+0

当被调用的方法(** Methodod1 **)抛出'Exception'时,我们必须用'throws Exception'来定义调用方法(** Method2 **);如果我们没有在调用方法中传递该异常。这样做的目的是使** Method2 **的调用方法(** Method3 **)可以通过** Method2 **引发异常,并且您应该在此处理它,否则它可能会中断您的程序。 – Rito 2017-09-11 02:03:50

+0

同样,如果** Method3 **没有在它的主体中处理异常,那么它必须在其方法定义中定义'throws Exception'来提供它的调用方法。以前的评论__extension_ – Rito 2017-09-11 02:11:25

回答

90

在Java中,如您所知,异常可以分为两类:一类需要throws子句,或者如果您不指定一个,则必须处理异常。现在,见下图:

enter image description here

在Java中,你可以扔东西,它扩展了Throwable类。但是,您无需为所有类指定throws子句。具体而言,可以是ErrorRuntimeException或这两者的任何子类。在你的情况下,Exception不是ErrorRuntimeException的子类。所以,如果你没有处理那个特定的异常,它是一个检查的异常,并且必须在throws子句中指定。这就是为什么你需要throws条款。


Java Tutorial来自:

一个例外是一个事件,它的程序,扰乱的程序的指令的正常流动的执行期间发生。

现在,正如您所知异常分为两类:已选中和未选中。为什么这些分类?

检查异常:它们被用来表示在程序执行过程中可以恢复的问题。他们通常不是程序员的错。例如,由用户指定的文件不可读,或没有可用的网络连接等。在所有这些情况下,我们的程序不需要退出,而是可以采取诸如警告用户的操作或进入回退机制(如网络不可用时脱机工作)等。

未经检查的异常:它们又可以分为两个:错误和RuntimeException。他们没有制止的一个原因是他们数量众多,并且需要处理所有这些都会使我们的程序混乱并降低其清晰度。另一个原因是:

  • 运行时例外:他们通常发生是由于程序员的错。例如,如果出现除零的ArithmeticException或出现ArrayIndexOutOfBoundsException,这是因为我们在编码中不够细心。他们通常是因为我们程序逻辑中的一些错误而发生所以,在我们的程序进入生产模式之前,它们必须被清除。它们没有被检查,因为我们的程序在发生时必须失败,以便程序员可以在开发和测试自己时解决它。

  • 错误:错误是通常程序无法恢复的情况。例如,如果StackOverflowError发生,我们的程序就不能做很多事情,比如增加程序的函数调用堆栈的大小。或者如果发生了一个OutOfMemoryError,我们不能做太多的事来增加我们程序可用的RAM数量。在这种情况下,最好退出程序。这就是为什么他们没有被选中。

有关详细信息,请参阅:

+0

我从你的答案中得到的是Error类及其子类和RuntimeException类及其子类,它们处于未经检查的异常(如System.out.println(5/0);不需要抛出,因为它是一个运行时异常,但我们仍然可以应用try catch)并检查Exception类,所以我们需要在该方法和每个调用它的方法中声明throws子句 – Nil 2012-07-21 04:45:43

+0

@ rd4code或者我们必须使用try ... catch来处理它们。 – Jomoos 2012-07-21 04:47:14

+0

还有一个问题:如果将异常分为未检查和检查,特别是未检查的(运行时错误),以避免编译期间出现更多错误? – Nil 2012-07-21 05:04:25

3

Exception是一个检查异常类。因此,任何调用声明它的方法的代码都必须处理或声明它。

+0

链中的每个方法都被声明为抛出Exception,包括main。那么问题在哪里? – 2012-07-21 04:09:14

+0

@PaulTomblin我问这就是为什么有必要在调用函数中写入throws异常,调用一个引发异常的函数 – Nil 2012-07-21 04:14:12

+0

好吧,我不明白你为什么问一个编译器错误,你实际上没有得到从你发布的代码。这是一种奇怪的问道。 – 2012-07-21 04:15:28

18

的Java需要处理或声明的所有异常。如果你没有使用try/catch块处理异常,那么它必须在方法的签名中声明。

例如:

class throwseg1 { 
    void show() throws Exception { 
     throw new Exception(); 
    } 
} 

应该写成:

class throwseg1 { 
    void show() { 
     try { 
      throw new Exception(); 
     } catch(Exception e) { 
      // code to handle the exception 
     } 
    } 
} 

这样你就可以摆脱在方法声明中“抛出异常”宣言。

+3

不是'RuntimeException'的子类的所有异常,即。 – yshavit 2012-07-21 04:25:14

+0

如果有任何其他类像异常被检查? – Nil 2012-07-21 05:12:56

+1

你是什么意思?由于所有的异常对象都有“Exception”作为它们的基类,如果你捕捉到一个“Exception”对象(就像我的例子),它会捕获抛出的异常。为了更具体(因为不同的例外可能需要不同的方式来处理事情),你应该有多个catch块。 – jebar8 2012-07-21 05:19:04

3

throws Exception声明跟踪的可能抛出的预料之中,但不可避免的理由例外方法的自动化方法。声明是典型地具体说明可能抛出,如throws IOExceptionthrows IOException, MyException异常的一种或多种类型。

我们都已经或将最终编写意外停止和报告异常,由于某些我们没有通过零或指数运行的程序,像师出界此前预期的代码。由于该方法没有预料到错误,因此它们不能被“捕获”并用try catch子句处理。任何毫无戒心的方法用户也不知道这种可能性,他们的程序也会停止。

当程序员知道某些类型的错误,可能会发生的,但是想处理方法之外,这些例外,该方法可以“抛出”一个或多个类型的异常调用方法,而不是处理它们。如果程序员没有宣布该方法(可能)抛出异常(或者,如果Java的没有宣布它的能力),编译器可能不知道,这将是长达了解的方法,将来用户,捕捉并处理该方法可能抛出的任何异常。由于程序可以有许多不同程序编写的方法层,因此很难(不可能)跟踪哪些方法可能会抛出异常。

尽管Java有能力声明异常,但仍然可以编写一个新的方法,但未处理和未声明的异常,Java将编译它,并且可以运行它并希望获得最佳效果。什么Java将不会让你做的就是编译你的新方法,如果它使用的是已被宣布为引发异常(S)的方法,除非你要么处理异常声明(一个或多个)在你的方法或声明的方法抛出相同例外情况或者如果有多个例外情况,你可以处理一些例外情况。

当程序员声明该方法抛出特定类型的异常时,它只是一种自动的方式来警告其他程序员使用该方法可能会出现异常。然后,程序员可以决定处理异常,或者通过声明调用方法传递相同的异常来传递警告。由于编译器已经被警告,这种新方法中可能出现异常,所以它可以自动检查未来的新方法调用者是处理异常还是声明它并强制执行一个或另一个异常。

这种类型的解决方案的好处是,当编译器报告Error: Unhandled exception type java.io.IOException时,它给出了被声明为抛出异常的方法的文件和行号。然后,您可以选择简单地通过降压并声明您的方法“抛出IOException”。这可以一直执行到主要方法,然后程序停止并向用户报告异常。但是,最好捕捉异常并以一种很好的方式处理异常,例如向用户解释发生了什么以及如何解决它。当一个方法捕获并处理异常时,它不再需要声明异常。可以这么说,降压就停在那里。

相关问题