投掷条款有什么意义?

时间:2014-06-27 23:42:13

标签: java exception throws

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

import java.io.IOException;

public class Blah {

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

        throw new IOException();

    }

}

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

能够" duck"将其添加到方法中的异常throws子句只是在创建其他人将要使用的代码时的灵活性。也许你的代码得到异常,但你宁愿你的方法的调用者处理它而不是处理它异常,允许调用开发人员知道发生了什么,而不是仅仅重新抛出异常或返回空值。

答案 2 :(得分:1)

  

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

事实上,它比那更强大。重点是强制开发人员(您)在应用程序的某个时刻对错误做些什么。你可以做以下两件事之一:

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

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

在这个(一般)背景下,throws的要点很清楚。如果语言没有throws声明,那么Java的检查异常设计将不起作用 1

就Java语言规范而言,这些规则将同等地应用于所有Java方法,包括main方法。因此,您必须在您的throws IOException上加上“毫无意义的”main。但它真的没有意义吗?我会说不。请考虑以下事项:

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

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

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

  • 应用程序的代码库包含对main方法的特定调用的情况如何?像其他调用一样处理这样的调用会不会更好...这取决于main方法中声明已检查异常的throws方法?

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


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

答案 3 :(得分:0)

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