为什么调用函数时需要“抛出异常”?

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


答案 1

在 Java 中,您可能知道,异常可以分为两类:一个是需要子句的,另一个是不需要子句的,另一个是不需要子句的。现在,请参阅下图:throws

enter image description here

在Java中,您可以抛出任何扩展类的内容。但是,您不需要为所有类指定子句。具体来说,是这两个子类的一个或或任何子类的类。在您的情况下,不是 或 的子类。因此,它是一个已检查的异常,如果您不处理该特定异常,则必须在子句中指定。这就是为什么你需要这个子句。ThrowablethrowsErrorRuntimeExceptionExceptionErrorRuntimeExceptionthrowsthrows


来自 Java Tutorial

异常是在程序执行期间发生的事件,它破坏了程序指令的正常流。

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

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

未选中的例外:它们同样可以分为两个:Errors 和 RuntimeExceptions。它们不受检查的一个原因是它们的数量很多,并且需要处理所有这些程序会使我们的程序混乱并降低其清晰度。另一个原因是:

  • 运行时异常:它们通常是由于程序员的错误而发生的。例如,如果发生或发生除以零的一个,那是因为我们在编码时不够小心。它们通常是因为我们的程序逻辑中存在一些错误。因此,在我们的程序进入生产模式之前,必须清除它们。从某种意义上说,它们是不受控制的,我们的程序在发生时必须失败,以便我们程序员可以在开发和测试本身时解决它。ArithmeticExceptionArrayIndexOutOfBoundsException

  • 错误:错误是程序通常无法恢复的情况。例如,如果发生,我们的程序不能做太多事情,例如增加程序的函数调用堆栈的大小。或者,如果发生,我们无法做很多事情来增加程序可用的RAM量。在这种情况下,最好退出程序。这就是为什么它们不受检查的原因。StackOverflowErrorOutOfMemoryError

有关详细信息,请参阅:


答案 2

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
        }
    }
}

这样,您可以摆脱方法声明中的“throws Exception”声明。


推荐