eclipse要求我在finally块中使用try / catch包围 - 可以禁用它吗?

时间:2011-08-03 09:38:41

标签: java eclipse

在我的一个Java应用程序代码中,我有一个try-catch-finally块,其中try块创建了一些输入和输出流,如果出现问题,我会关闭{{1中的任何早期打开的流}}

finally

但Eclipse中的finally { if(inputStream != null) inputStream.close(); if(outputStream != null) outputStream.close(); } 行在此行的代码中显示“Unhandled exception IOException”错误,并显示解决方案是在<stream>.close()块中包含另一个try/catch作为编程实践似乎很糟糕,我不想在最终阻止。

我的问题是:是否可以在Eclipse中删除此错误并仅在需要时使用finally而不是eclipse告诉我执行try/catch添加。 (因为我已经尝试通过尽可能用try/catch替换try/catch来避免异常。)

6 个答案:

答案 0 :(得分:9)

这不是Eclipse错误,是Java编译器错误。 Eclipse只是为您报告Java编译错误。如果没有try / catch子句,代码无法编译,就无法“关闭”。它是Java中的一个安全功能,它会强制您处理通常抛出的异常。

方法在签名中有例外。例如,InputStream.close()抛出IOException,强制您在try / catch块中处理它。

public void close() throws IOException {
    ...

抛出异常是告诉程序一个重要问题 - 必须处理 - 已经发生的一种方式。

  

我的问题是:是否有可能在eclipse中删除此错误并在需要时使用try / catch而不是eclipse告诉我做try / catch add。

不,这是不可能的。

  

(因为我已经尝试通过尽可能用if / else替换try / catch来避免异常。)

您通常不应尝试使用try/catch块替换if/else块。它们是两个截然不同的特征,具有不同的目的。

异常是Java必不可少的功能。 Read about it并了解它。

答案 1 :(得分:6)

正确地应该这样做,以确保我们尝试关闭两个流。

finally
{
   try {
     if(inputStream != null)
        inputStream.close();
   }
   catch(Exception e)
   { /* Ignore */ }

   try {
     if(outputStream != null)
        outputStream.close();
   }
   catch(Exception e)
   { /* Ignore */ }
}

答案 2 :(得分:4)

如果您不关心处理异常,请查看Apache commons io库。

org.apache.commons.io.IOUtils.closeQuietly(inputstream)

也适用于输出流,作家和读者。

答案 3 :(得分:2)

IOException不是您可以避免的,因为它可能因您无法控制的情况而发生。 (网络连接断开,硬盘错误等)。 Eclipse完全正确,inputStream.close()outputStream.close()本身可能会抛出异常,而你必须准备以某种方式处理它。没有办法沉默这个错误,因为它不是Eclipse的挑剔;您的代码不是现有的有效Java代码。

您可以声明您的函数throws IOException并将异常处理委托给调用者,或者您必须咬住子弹并自己处理(并可能忽略)IOException。我认为Apache Commons的IOUtils库中有一个实用函数,它封装了这个逻辑,这会使你的代码更清晰(隐藏你默默忽略IOException的事实)。

答案 4 :(得分:0)

  

但是eclipse中的.close()行显示错误,该行的代码中出现了未处理的异常IOException,并显示解决方案包含finally块中的另一个try / catch,这对编程实践来说很糟糕,我不想在finally块中

close方法也可以抛出IOExceptions,因此你必须在finally块中包含嵌套的try / catch子句,这是一个不幸的情况。

但是你真的无能为力。你需要那些(丑陋的)finally块来正确处理异常。

答案 5 :(得分:0)

eclipse没有任何问题。它只是显示你的代码中有编译错误。你不能用if-esle替换try-catch,这里需要尝试catch。你需要这个尝试捕获不是因为输入流可能为null,因为你尝试if else。