尝试阻止没有任何catch语句

时间:2015-11-27 19:23:26

标签: 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();
    }
}

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

我的印象是,包含throws子句是允许程序员抛出异常的特定类(或子类)的原因,并且当且仅当它或其中一个类被抛出时,才会抛出一个类它的超类在throws子句中。但是在这里,throws块中没有throw语句try子句。那么首先包括该条款有什么意义呢?代码中的哪个地方会被StreamException抓住?

5 个答案:

答案 0 :(得分:6)

  

代码中的哪个地方会被StreamException抓住?

tryfinally但没有catchfinally会执行,Exception会传播到来电者

答案 1 :(得分:4)

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

如果此代码使用了try-with-resources,那么这将确保close上抛出的异常无法屏蔽迭代流时抛出的异常。 (因为如果close方法抛出异常,那么即使try-block中的某些东西抛出了某些内容,调用者也会看到异常。)

答案 2 :(得分:1)

如果我没有错,StreamException将无法从此课程处理,但会在catch (StreamException se) {...}即来电者处理。

无论是否抛出异常,finally块都会始终执行,因此它将始终关闭流。

您可以拥有3种不同类型的try块:

  1. try-catch(尝试或捕获块将被执行)
  2. try-catch-finally(尝试或捕获块将被执行,最后块将执行,无论如何)
  3. try-finally(两个区块都将被执行)

答案 3 :(得分:0)

throws SomeException后跟方法签名,

表示一些代码块写入的代码块可能抛出编译时异常。

根据java的exception规则。当任何compile-time exception抛出时, 需要声明或处理。

在这里,在您的代码中没有编写任何throw语句,但是来自块的一些方法调用需要handle or declare它。

throws Exception would propagate to the invoker.

答案 4 :(得分:0)

Java 7引入了try-with-resources语句,可以完美地处理这种情况。

public boolean searchFor(String file, String word)
    throws StreamException
{
    try (Stream input = new Stream(file)) {
        while (!input.eof()) {
            if (input.next().equals(word)) {
                return true;
            }
        }
        return false;         //not found
    }
}

这与您的示例完全相同,适用于实现AutoCloseable的任何内容。

注意替换代码的人:如果在try块和try-with语句或finally块中抛出异常,则返回Exception与抑制之间存在细微差别。有关详细信息,请参阅Oracle docs