【问题标题】:What is the point in throws clause?throws 子句有什么意义?
【发布时间】:2014-06-27 23:42:13
【问题描述】:

我理解检查异常的意义:提醒开发人员您需要注意的错误。如果您无法从中恢复,我也理解不处理某些异常的意义。 但是为什么会这样,如果您决定不处理已检查的错误, 您必须包含 throws 语句。 如果您运行此代码,您将获得一个运行时错误,如果你注释掉 throws 语句(并添加一个 { ),你会得到一个编译时错误。如果 main() 仍然会中断程序,这似乎毫无意义。

import java.io.IOException;

public class Blah {

    public static void main(String[] args) 
        throws IOException {

        throw new IOException();

    }

}

【问题讨论】:

    标签: java exception throws


    【解决方案1】:

    throws 子句表示允许方法抛出某些异常。它列出了方法与其调用者之间的契约,让他们知道它可以抛出哪些检查异常,以及调用者应该准备处理哪些异常,但被调用的方法没有每次都扔掉,或者根本扔掉。

    【讨论】:

    • 但是告诉他们它可以扔哪些是什么目的呢?通知使用代码的开发人员他们必须捕获它?
    • @Lightfire228 理论上,通过强制调用者处理可能出错的事情,您可以获得更健壮和可预测的程序。 (在实践中,这个想法并不那么成功,因为检查了许多类型的异常,即使没有任何有用的方法可以处理它们,所以人们养成了重新抛出异常的习惯,或者更糟的是,忽略它们!)
    【解决方案2】:

    能够通过将异常添加到方法 throws 子句来“躲避”异常的意义在于创建其他人将要使用的代码时的灵活性。也许您的代码会遇到异常,但您更愿意方法的调用者来处理它,而不是自己处理异常,让调用开发者知道发生了什么,而不是仅仅重新抛出异常或返回空值。

    【讨论】:

      【解决方案3】:

      我理解检查异常的意义:提醒开发人员您需要注意的错误。

      事实上,它比这更强大。重点是强制开发人员(您)在应用程序中的某个时间点对错误进行处理。您可以执行以下两项操作之一:

      • 您可以在引发异常的同一方法体中捕获并(希望)处理异常。

      • 您可以将异常添加到方法的throws 列表中......以便它传播到方法的调用者。这将处理异常的初始责任交给了调用者代码。

      在这个(一般)上下文中,throws 的意义很明确。如果该语言没有 throws 声明,那么 Java 的检查异常设计将不起作用1

      就 Java 语言规范而言,这些规则同样适用于所有 Java 方法,包括 main 方法。所以你必须把“毫无意义”的throws IOException 放在你的main 上。但这真的没有意义吗?我会争辩不。考虑以下几点:

      • 如果您允许异常从应用程序的入口点main 传播出去,那么用户会看到一个丑陋的堆栈跟踪。就他/她而言,您的应用程序已经“崩溃”了。

        如果发生IOException,Java 编译器告诉您main 方法将“崩溃”不是更好吗?

      • 假设您的应用程序中有两个类,它们都有一个main 方法。是否应该允许它们在不声明的情况下传播已检查的异常?

      • 如果应用程序的代码库包含对main 方法的特定调用,该怎么办?像其他调用一样处理这样的调用不是更好吗...这取决于在throws 子句中声明检查异常的main 方法?

      如您所见,希望main 方法遵循与其他方法相同的异常规则是有充分理由的。


      1 - 要么你必须在它们被抛出的相同方法中捕获已检查的异常,并且库方法不能抛出已检查的异常,或者你需要对每个应用程序进行全局分析 在加载时查看是否捕获了已检查的异常。

      【讨论】:

        【解决方案4】:

        如果另一个程序使用了它需要能够捕获并处理它的方法

        【讨论】:

        • 或者它可以选择把它扔给它的调用者。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 2016-05-26
        • 2013-12-25
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多