【问题标题】:eclipse asks me to surround with try/catch in finally block - possible to disable it?eclipse 要求我在 finally 块中用 try/catch 包围 - 可以禁用它吗?
【发布时间】:2011-10-18 23:04:32
【问题描述】:

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

finally
{
    if(inputStream != null)
        inputStream.close();
    if(outputStream != null)
        outputStream.close();
}

但是 Eclipse 中的 <stream>.close() 行在该行的代码中显示错误“未处理的异常 IOException”,并表明解决方案是在 finally 块中包含另一个 try/catch,这似乎很糟糕编程练习,我不想在 finally 块中。

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

【问题讨论】:

标签: java eclipse


【解决方案1】:

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

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

public void close() throws IOException {
    ...

抛出异常是告诉程序发生了必须处理的重大问题的一种方式。

我的问题是:是否可以在 eclipse 中删除此错误并在我需要时使用 try/catch,否则不能代替 eclipse 告诉我添加 try/catch。

不,这是不可能的。

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

您通常不应该尝试用if/else 块替换try/catch 块。它们是具有不同目的的两个不同功能。

异常是一个基本的 Java 特性。 Read about it 了解一下。

【讨论】:

  • 这是一个很好的功能,虽然我认为如果我添加 try-catch,那么它会像嵌套的 try-catch。通常最终应该做一些简单的事情并结束尝试开始的事情,这就像糟糕的编码习惯。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,正如你在上面写的那样,我现在确实这样做了,但我不喜欢最后在里面有 try-catch。但似乎我无法避免它。
  • Java 很丑。 using 块早就该了
【解决方案3】:

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

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

也适用于输出流、写入器和读取器。

【讨论】:

  • 我没有得到这个解决方案,你的意思是我可以使用上面的包来抑制 try-catch 的使用吗?抱歉有任何错误的问题,我对 eclipse 有点陌生。
  • 是的,就是这样,这个库会安静地关闭流而不抛出任何异常。您可以从commons.apache.org/io 下载它。它还有许多其他有用的东西,例如将输入流/读取器复制到输出流/写入器。就像其他人所说的那样,这不是您遇到的 Eclipse 问题,而是一个有效的 Java 错误。但由于关闭流是否引发错误通常无关紧要,因此该库将为您提供完全隐藏它的选项。
【解决方案4】:

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

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

【讨论】:

  • 哦,我明白了,如果是这样,我必须使用环绕 try/catch 来关闭方法
【解决方案5】:

但是 Eclipse 中的 .close() 行在该行的代码中显示了 Unhandled exception IOException 错误,并显示了在 finally 块中包含另一个 try/catch 的解决方案,这作为编程实践很糟糕,我不想在 finally 块中.

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

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

【讨论】:

    【解决方案6】:

    eclipse没有什么问题。它只是表明你的代码中有一个编译错误。你不能用if-esle替换try-catch,这里需要try catch。你需要这个try抓住不是因为输入流可能是空的,因为你在 if else 中尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2013-12-16
      • 2014-11-27
      • 2010-10-30
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多