try / catch / finally中没有catch会发生什么?

时间:2012-12-08 01:36:11

标签: java exception

看一个我在中期测试中出错的问题,我想知道:

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?

3 个答案:

答案 0 :(得分:5)

将执行finally块,然后最初抛出的异常(即由readData(in)引发的第一个异常)将渗透。

我认为这个问题的警告是关于将要渗透的异常类型。这可以是IOException,也可以是任何类型的未经检查的异常(即java.lang.RuntimeExceptionjava.lang.Error的子类。)

根据@ zapl的评论

已编辑:如果finally块引发IOException(由于inputFile.close()),该异常将被渗透到调用者,无论try块是否引发异常。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

  

这会将所有异常传递回链中,还是仅传递已检查的IOException?

它将传递所有异常,但是应该声明编译readData的代码只能抛出IOException或其子类。

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