在finally块中设置reference = null?

dea*_*mon 6 java exception-handling exception finally

我的一位同事null在最后的块中提到了参考.我认为这是胡说八道.

public Something getSomething() {
    JDBCConnection jdbc=null;
    try {
        jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL);
        ...
    }
    finally {
        JDBCManager.free(jdbc);
        jdbc=null; // <-- Useful or not?
    }
}
Run Code Online (Sandbox Code Playgroud)

你怎么看呢?

kro*_*ock 12

你是对的,jdbc是一个局部变量,所以当getSomething()方法返回时jdbc将超出范围并且符合垃圾收集条件,这实际上与将其设置为null相同.因此,当下一行代码超出范围时,将变量设置为null是没有意义的.

优良作法是将变量限制在所需的最小范围内,例如,如果在for循环中只需要一个变量,那么在for循环中声明它,并且当代码退出for循环时它将有资格进行垃圾收集.这样,除了降低方法的复杂性之外,甚至还需要将局部变量设置为null,并且有利于您的代码变得更加模块化,更易于阅读和维护.


aio*_*obe 5

因为它是一个局部变量,所以它无论如何都会超出范围.这是胡说八道.

如果它是长寿命对象的实例变量(成员变量),它可能是有用的,因为否则可能会阻止垃圾收集器处理对象.