在我的一个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
来避免异常。)
答案 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。