4

看到一个我在期中考试中做错的问题,这让我想知道:

public double[] readInputFile(String fielane) throws IOException
{
  File inputFile = new File(filename);
  Scanner in = new Scanner(inputFile);
  try
  {
    readData(in);
    return data;
  }
  finally
  {
    inputFile.close();
  }
}

这会将所有异常传递到链上,还是只会传递检查过的 IOException?

4

3 回答 3

5

finally块将被执行,然后最初抛出的异常(即,作为 的结果抛出的第一个异常readData(in))将向上渗透。

我想这个问题的警告是关于将被渗透的异常类型。这可能是IOException,或任何类型的未经检查的异常(即,或的子类java.lang.RuntimeExceptionjava.lang.Error

根据@zapl的评论进行编辑:如果finally块抛出IOException(作为 的结果inputFile.close()),则该异常将渗透到调用者,无论该try块是否抛出异常。

于 2012-12-08T01:38:06.867 回答
1

块内的代码finally将始终被执行,与上面的块内是否发生异常无关try

在您的示例中,该finally块确保关闭输入文件;因此,即使抛出异常,也可以保证连接不会保持打开状态。

于 2012-12-08T01:39:55.147 回答
1

这会将所有异常传递到链上,还是只会传递检查过的 IOException?

它将传递所有异常,但要编译的代码readData应声明为仅抛出IOException或其子类。

finally块将在该try块之后执行,就像往常一样。

于 2012-12-08T01:42:22.100 回答