0

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

import java.io.IOException;

public class Blah {

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

        throw new IOException();

    }

}
4

4 回答 4

4

throws子句说允许方法抛出某些异常。它规定了方法与其调用者之间的约定,让他们知道它可以抛出哪些已检查的异常以及调用者应该准备处理哪些异常,但被调用的方法不必每次都抛出它们,或者一点也不。

于 2014-06-27T23:43:56.833 回答
1

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

于 2014-06-27T23:50:17.357 回答
1

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

事实上,它比这更强大。关键是迫使开发人员(你)在应用程序的某个点对错误做一些事情。您可以执行以下两项操作之一:

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

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

在这个(一般)上下文中,要点throws很清楚。如果语言没有throws声明,那么 Java 的检查异常设计将无法工作1

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

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

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

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

  • main应用程序的代码库包含对方法的特定调用的情况呢?像其他调用一样处理这样的调用不是更好吗……这取决于在子句main中声明检查的异常的方法?throws

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


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

于 2014-06-28T01:05:37.457 回答
0

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

于 2014-06-27T23:45:19.953 回答