在Eclipse Neon中,如果我编写这个Java代码:
Stream<Object> stream = Stream.builder().build();
我没有泄漏警告,但是如果我实施Stream
,例如
public class MyStream<T> implements Stream<T> {
// implementation
}
我写了类似的代码
Stream<Object> stream = new MyStream<>();
我收到Resource leak: 'stream' is never closed
警告。这只发生在Eclipse中,而使用javac
进行编译时不会发出任何警告。
注意我不是在寻找关于如何关闭流等的答案,而是寻找解释同一界面出现这种不同行为的原因的答案。
答案 0 :(得分:4)
Eclipse有一个不需要清理的类型的白名单,因为它们实际上并不是指系统资源。此处列出了核心Java类型,但您的自定义类型不是。有关详细信息,请参阅the help。
答案 1 :(得分:3)
在第一种情况下,您不是在创建资源实例。在第二种情况下,你是。
eclipse documentation states the following:
所有权/责任
以上诊断基本上假设 创建资源类型实例的方法也是 负责关闭此资源。 [...]
- 如果方法通过方法调用而不是通过新表达式获取资源,则它可能负责也可能不负责;任何问题都是 仅被标记为潜在的资源泄漏。