尝试阻止没有任何catch语句

Unw*_*ast 6 java exception try-catch

我正在阅读关于异常和断言的章节中的Java教科书,并且遇到了这个代码块,我有一个问题.

public boolean searchFor(String file, String word)
    throws StreamException
{
    Stream input = null;

    try {
        input = new Stream(file);
        while (!input.eof())
            if (input.next().equals(word))
                return true;
        return false;         //not found
    } finally {
        if (input != null)
            input.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

在下一段中,文本说"该searchFor方法声明它抛出,StreamException以便生成的任何异常在清理后传递给调用代码,包括StreamException调用close所引发的任何异常.

我的印象是,包含一个throws子句允许程序员抛出异常的特定类(或子类),并且当且仅当它或它的一个超类在throws子句中时,才能抛出一个类.但是在这里,有一个throws条款没有throw声明try.那么首先包括该条款有什么意义呢?在代码中的位置会StreamException被捕获?

Ell*_*sch 6

在代码中的位置会StreamException被捕获?

tryfinally,但没有catch.该finally会执行,并Exception会传播到调用者.

  • 正如Nathan的[回答](http://stackoverflow.com/a/33963739/2970947)所指出的,[`try-with-resources`声明](http://docs.oracle.com/javase/tutorial/ essential/exceptions/tryResourceClose.html)还有一个额外的好处就是不会在`finally`块中屏蔽任何`Exception`(我认为你的书早于`try-with-resources`). (4认同)

Nat*_*hes 5

关键是要确保流关闭,无论方法中发生了什么。迭代流时抛出的任何内容都会被抛出给调用者。(每个调用者依次可以自由地捕获异常或将其抛出给其调用者,依此类推。)

如果此代码使用 try-with-resources,那么这将确保关闭时引发的异常无法掩盖迭代流时引发的异常。(如果 close 方法抛出异常,那么调用者就会看到这样的情况,即使 try 块中的某些内容抛出了某些内容。)