我正在阅读关于异常和断言的章节中的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
抓住?
答案 0 :(得分:6)
代码中的哪个地方会被
StreamException
抓住?
try
有finally
但没有catch
。 finally
会执行,Exception
会传播到来电者。
答案 1 :(得分:4)
重点是确保流关闭,无论方法中发生了什么。迭代流中抛出的任何内容都会被抛给调用者。 (每个调用者可以自由地捕获异常或将其抛给调用者,依此类推。)
如果此代码使用了try-with-resources,那么这将确保close上抛出的异常无法屏蔽迭代流时抛出的异常。 (因为如果close方法抛出异常,那么即使try-block中的某些东西抛出了某些内容,调用者也会看到异常。)
答案 2 :(得分:1)
如果我没有错,StreamException
将无法从此课程处理,但会在catch (StreamException se) {...}
即来电者处理。
无论是否抛出异常,finally
块都会始终执行,因此它将始终关闭流。
您可以拥有3种不同类型的try
块:
try-catch
(尝试或捕获块将被执行)try-catch-finally
(尝试或捕获块将被执行,最后块将执行,无论如何)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。