如何在Eclipse中生成自定义编译器警告?

时间:2013-07-13 14:40:41

标签: java eclipse compiler-warnings suppress-warnings bonecp

我正在尝试使用BoneCP作为DBCP的替代池替代方法。我将bonecp-0.8.0rc-1.jar添加到我的运行时类路径中,并将代码页中的代码复制粘贴到我的测试驱动程序中:

Connection connection = null;
BoneCP connectionPool;
try {
    Class.forName(config.getDatabaseLogger().getJDBCDriver());

    BoneCPConfig boneConfig = configureBoneCP(config);

    connectionPool = new BoneCP(boneConfig);

    connection = connectionPool.getConnection();    // fetch a connection
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

在行上写着:

connectionPool = new BoneCP(boneConfig);
Eclipse(Juno)给了我一个编译器警告:

  

资源泄漏:'connectionPool'永远不会关闭

然后它为我提供了“将@SuppressWarnings'资源添加到newConnectionManager ”的选项(newConnectionManager()引用包含在其中的类)。

这怎么可能?!?! Eclipse如何知道BoneCP对象的任何信息,以及它如何知道它必须关闭?这是与BoneCP库一起提供的某种“自定义警告”吗?如果是这样,我如何添加/注释代码到我自己的项目,以帮助警告下游开发人员他们没有正确使用我的库?提前谢谢!

2 个答案:

答案 0 :(得分:1)

How does Eclipse know anything about a BoneCP object, 
                                  and how does it know that it must be closed?

Docs of eclipse says

  
    

实现接口java.io.Closeable(自JDK 1.5以来)和java.lang.AutoCloseable(自JDK 1.7以来)的类被认为代表外部资源,当它们不再使用方法close()时应该关闭需要的。

  
     

Eclipse Java编译器能够分析使用此类型的代码是否符合此策略。

     

对象不直接表示操作系统资源。如果包装的资源已关闭,则包装器不需要关闭。相反,如果封装器关闭,这将包括关闭包装的资源。该分析具有用于检测包装器资源的第二个白名单,并将识别是否将通过包装器直接或间接关闭基础实际资源。任何一个都足以沉默关于资源泄漏的警告。 白名单包含来自java.io ,java.util.zip,java.security,java.beans和java.sound.sampled的类。

你的BoneCP classe实现了接口 java.io.Serializable ,这可能是原因。

答案 1 :(得分:1)

警告是由此声明引起的:

connection = connectionPool.getConnection();

方法getConnection()返回类型为java.sql.Connection的对象,该对象自Java 7开始实现java.lang.AutoCloseable。当Eclipse无法确定是否实现{{1}的资源时,Eclipse会生成此警告或java.io.Closeable被所有可能的代码路径关闭。