我在IOUtils上使用了一个很好的函数,名为“closequity”,它可以关闭流,不管流中有什么。
例如:
InputStream input = null;
try
{
...
input = connection.getInputStream();
...
}
catch(Exception e)
{
}
finally
{
IOUtils.closeQuietly(input);
}
不知何故,当我在最后一个块中调用它时,它也隐藏了Eclipse上的警告,即“资源泄漏:‘输入’在此位置未关闭”。
这意味着在上述代码中,没有此类警告。
我不明白它是如何隐藏对自身“外部世界”的警告的。
我试图通过复制这个库的代码来检查它(这里的例子),但是当我在新类上使用它时,警告会出现。这没有意义...
下面是我创建的一个示例代码,用于显示警告将出现在您自己的类上:
public class MyIOUtils {
public static void closeQuietly(final InputStream input) {
if (input == null)
return;
try {
input.close();
} catch (final IOException ioe) {
}
}
public static void closeQuietly(final OutputStream output) {
if (output == null)
return;
try {
output.close();
} catch (final IOException ioe) {
}
}
}
用法:
public class Test {
public void test() {
InputStream inputStream = null;
try {
inputStream = new FileInputStream("dummyFile.txt");
int t = 0;
--t;
if (t < 0)
return; // here you will get a warning
} catch (final FileNotFoundException e) {
} finally {
MyIOUtils.closeQuietly(inputStream);
}
}
}
以下是我看到的,包括我安装的Eclipse版本:
它是怎么做到的?
我无法在Eclipse安装中重现这个问题,因此无法测试我的解释。然而,这就是我们在http://www.google.com/url?sa=t
资源包装器和无资源闭包
JDK定义了一些实现Closeable但不直接表示操作系统级别的资源的类。
JAVA伊奥。StringReader是不需要调用close()的closeable的一个例子,因为没有需要清理的操作系统资源。分析使用显式白名单来检测来自java的类。属于这一类的信息。没有发布有关这些类的资源泄漏警告。
类的实例,比如java。伊奥。BufferedInputStream是另一个资源的包装器(包装器可以在多个级别上应用)。此外,这些对象并不直接表示操作系统资源。如果包装的资源已关闭,则包装器不需要关闭。相反,如果包装被关闭,这将包括关闭包装的资源。该分析还有第二个白名单,用于检测包装器资源,并将识别底层实际资源是否将通过包装器直接或间接关闭。任何一个都足以消除有关资源泄漏的警告。白名单包含来自java的类。伊奥,爪哇。util。爪哇。安全,java。豆子和java。声音取样。
提示:通常最好/最安全的是关闭最外层的包装器,而不是包装的资源。
根据IOUtils留档,这个类中读取流的所有方法都在内部缓冲。这意味着没有理由使用BufferedInputStream或BufferedReader。4K的默认缓冲区大小在测试中被证明是有效的。
那么为什么它对IOUtils有效呢?eclipse团队做了一件非常简单的事情——他们对方法进行了硬编码!在eclipse的早期版本中,警告也存在,但从版本4.3 M4开始,警告就消失了,因为他们修复了它:
Released for 4.3 M4 via commit 277792ba446c3713bcfdc898c37875d45fc06c18.
The fix covers the following well-known methods:
- com.google.common.io.Closeables.closeQuietly(Closeable)
- com.google.common.io.Closeables.close(Closeable,boolean)
- org.apache.commons.io.IOUtils.closeQuietly(Closeable)
有关详细信息,请参见此处,尤其是最后的评论。。。
更新:那么这对你意味着什么?你必须使用其中一种obove方法,否则就必须接受警告。检查基本上不复杂,也不检查下一个级别。
更新二:他们基本上硬编码了文件名。也许用源代码更容易理解。想象这是检查警告的日蚀代码:
public boolean showResourceWarning(){
//do somestuff to detect whether a potential ressource warning is shown
...
if(resourceLeakWarning){
if(this.checkForExceptions()){
return false;
}
}
return resourceLeakWarning;
}
private boolean checkForExceptions(){
if(name.equals("org.apache.commons.io.IOUtils.closeQuietly(Closeable)"){
return true;
}
if(name.equals("com.google.common.io.Closeables.close(Closeable,boolean)")){
return true;
}
if(name.equals("org.apache.commons.io.IOUtils.closeQuietly(Closeable)")){
return true;
}
// code executed for your method:
return false;
}
=
更新三:看看下面的类TypeConstants。JAVA你看到里面的名字了吗?如果你想让它与你的代码一起工作,你需要在那里添加你的类和方法名,然后重新编译eclipse。然后看MessageSend类。java从第90行开始。
我是个新手。我已经编写了这段代码,它显示那里存在资源泄漏 这是什么意思?抱歉,我太天真了。
在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?
我正在读取一个文件并将其内容存储在字符串中。代码给了我一个警告:Resource leak:。我如何解决它?
eclipse“潜在资源泄漏”警告不正确。 没有警告: 警告:潜在资源泄漏:“此位置可能未关闭响应” 为什么第二种方法会引起警告? 谢谢!
Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?
大家晚上好。我是一个使用Java编程的完全初学者,我正在学习“扫描仪”,但是当我在Eclipse中键入这个基本代码时,我收到一条消息说“资源泄漏:‘扫描仪’永远不会关闭。 我做错了什么?