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

2023-12-30

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(), and main() have

未报告的异常 必须捕获或声明抛出的异常

当我删除时throws Exception从这些方法?


您可能知道,在 Java 中,异常可以分为两类: 一种需要throws如果您未指定一个或另一个未指定的子句,则必须处理该子句。现在,请看下图:

在Java中,你可以抛出任何扩展Throwable班级。但是,您不需要指定throws所有类别的子句。具体来说,类要么是Error or RuntimeException或这两个的任何子类。在你的情况下Exception不是一个子类Error or RuntimeException。因此,它是一个受检查的异常,必须在throws子句,如果您不处理该特定异常。这就是为什么你需要throws clause.


From Java教程 http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html:

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

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

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

未经检查的异常:它们又可以分为两类:错误和运行时异常。不检查它们的原因之一是它们数量众多,并且需要处理所有它们将使我们的程序变得混乱并降低其清晰度。另一个原因是:

  • 运行时异常:它们通常是由于程序员的错误而发生的。例如,如果ArithmeticException除以零发生或ArrayIndexOutOfBoundsException出现这种情况,是因为我们编码不够仔细。它们的发生通常是因为我们的程序逻辑中存在一些错误。因此,在我们的程序进入生产模式之前必须清除它们。它们是不受控制的,因为我们的程序在发生时必须失败,以便我们程序员可以在开发和测试本身时解决它。

  • Errors:错误是程序通常无法恢复的情况。例如,如果一个StackOverflowError发生这种情况时,我们的程序无能为力,例如增加程序的函数调用堆栈的大小。或者如果OutOfMemoryError发生这种情况时,我们无法做太多事情来增加程序可用的 RAM 量。在这种情况下,最好退出该程序。这就是为什么它们不受控制。

详细信息请参见:

  • 未经检查的异常——争议 http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
  • 捕获或指定要求 http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么调用函数时需要“抛出异常”? 的相关文章

随机推荐