Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java eclipse要求我在finally block中使用try/catch-可以禁用它吗?_Java_Eclipse - Fatal编程技术网

Java eclipse要求我在finally block中使用try/catch-可以禁用它吗?

Java eclipse要求我在finally block中使用try/catch-可以禁用它吗?,java,eclipse,Java,Eclipse,在我的一个Java应用程序代码中,我有一个try-catch-finally块,其中try块创建一些输入和输出流,如果出现问题,我会关闭finally中任何先前打开的流 finally { if(inputStream != null) inputStream.close(); if(outputStream != null) outputStream.close(); } 但是Eclipse中的.close()行显示了该行代码中“未处理的异常I

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

finally
{
    if(inputStream != null)
        inputStream.close();
    if(outputStream != null)
        outputStream.close();
}
但是Eclipse中的
.close()
行显示了该行代码中“未处理的异常IOException”的错误,并显示了解决方案是在
finally
块中包含另一个
try/catch
,这对于编程实践来说似乎是不好的,我不希望出现在finally块中


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

正确的做法应该是这样做,以确保我们尝试关闭两个流

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

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

IOException
不是你可以避免的事情,因为它可能发生在你无法控制的情况下。(网络连接中断、硬盘驱动器错误等)。Eclipse完全正确地认为,
inputStream.close()
outputStream.close()
本身可能引发异常,您必须准备以某种方式处理该异常。没有办法消除这个错误,因为这不是Eclipse的挑剔;您的代码不是现有的有效Java代码


您可以声明您的函数
抛出IOException
并将异常处理委托给调用方,或者您必须咬紧牙关自己处理(可能忽略)IOException。我认为ApacheCommons的
IOUtils
库中有一个实用函数封装了这个逻辑,它可以使您的代码更干净(并隐藏您正在默默忽略一个
IOException
)。

如果您不关心异常的处理,请查看ApacheCommons io库

org.apache.commons.io.IOUtils.closeQuietly(inputstream)
适用于outputstream、writer和reader

但是eclipse中的.close()行显示了这一行代码中未处理的异常IOException的错误,并显示了在finally块中包含另一个try/catch的解决方案,这与编程实践不符,我不希望在finally块中

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


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

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

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

public void close() throws IOException {
    ...
抛出异常是告诉程序必须处理的重大问题已经发生的一种方式

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

不,这是不可能的

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

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


异常是Java的一个基本特性。并且理解它。

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

有人知道新的
是否可以关闭吗
Java7中的语法更优雅地处理了这个问题?哦,我从来都不知道这一点,那么我从哪里可以得到关于它的信息呢?你能分享一个链接吗?看,是的,我现在确实这样做了,正如你在上面写的,但我不喜欢尝试捕捉里面最后。但看起来我无法避免,Java很难看。使用块的
太长了,我明白了,如果是这样的话,那么我必须使用环绕try/catch来关闭方法,这是一个很好的特性,尽管我认为在finally块中,如果我添加try-catch,那么它将像嵌套的try-catch一样。一般来说,我最终应该做一些简单的事情,结束一些尝试开始的事情,这就像糟糕的编码实践。我没有得到这个解决方案,你的意思是我可以使用上面的包来最终抑制try-catch的使用吗?对于任何错误的问题,很抱歉,我对eclipse不太熟悉。是的,就是这样,这个库将安静地关闭流,而不会抛出任何异常。你可以从下载。它还有许多其他有用的功能,比如将inputstream/reader复制到outputstream/writer。正如其他人所说,这不是Eclipse问题,而是一个有效的Java错误。但由于关闭流是否会引发错误通常无关紧要,因此此库将为您提供完全隐藏它的选项。