2

我有一个名为 SQLProvider 的类,它包含用于打开和关闭 SQLite 数据库连接的方法。使用注释或其他方法,如果使用 open 方法而不调用 close,是否可以标记编译器警告?

{
    SQLProvider provider = new SQLProvider();
    provider.open()
    // display a compiler warning unless provider.close() is also invoked in this code block
}
4

2 回答 2

5

我不确定这是否是最好的方法,但你可以让你的类实现Closeable接口。根据 Eclipse文档,Eclipse 将显示警告:

启用后,如果局部变量包含“java.lang.AutoCloseable”类型的值(合规性 >= 1.7)或“java.io.Closeable”类型的值(合规性 <= 1.6)并且如果流分析表明方法'close()'没有在该值上本地调用。

于 2013-07-07T05:13:33.383 回答
0

目前在标准 Java 工具链中没有这样的工具。

除了 Eclipse 编译器警告(参见 New Idiot 的回答),一些静态代码分析器可以警告您:

但问题是这些警告或多或少是启发式的。他们只了解用于可靠关闭资源的某些标准习语。如果您以其他方式(仍然可以证明是可靠的)执行此操作,则它们可能会产生错误警告。这不一定是坏事(因为以非标准方式执行此操作可能会愚弄/迷惑未来的读者!)。然而,误报的可能性可能会诱使开发人员忽略或(更糟糕的是)抑制警告。

还有几个额外的问题:

  • 对于具有方法但未实现或的资源对象,这些检查可能会给出假阴性。close()CloseableAutoCloseable

  • 这些检查可能会对操作为空操作的Closeable/AutoCloseable资源对象给出错误否定;close()例如,StringWriter

这些问题可以解释为什么标准 Java 工具链不支持这一点。

于 2013-07-07T05:26:20.487 回答