在finally块中设置reference = null?

时间:2010-06-09 08:26:05

标签: java exception exception-handling finally

我的一位同事在finally块中引用了null。我认为这是无稽之谈。

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

你怎么看?

7 个答案:

答案 0 :(得分:12)

你是对的,jdbc是一个局部变量,所以当getSomething()方法返回jdbc时,它将超出范围并且有资格进行垃圾收集,这实际上与将其设置为空值。因此,当它在下一行代码中超出范围时,将变量设置为null是没有意义的。

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

答案 1 :(得分:5)

因为它是一个局部变量,所以它无论如何都会超出范围。这是无稽之谈。

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

答案 2 :(得分:2)

是的,这几乎是胡说八道。动机通常是“帮助”垃圾收集器,但这根本不是真正的帮助,因为无论如何都要清除引用。虽然它也没有任何伤害,至少不是对于VM - 你的眼睛和理智是另一回事。

但是,该示例不会返回Something。如果示例不完整,并且在finally块之后实际上有语句,那么将jdbc设置为null可以起到阻止使用的作用,并且会立即发生的NPE通知finally块之后的任何使用。

答案 3 :(得分:1)

在这个特殊情况下,从技术上说,它真的没用。当方法返回时,jdbc不再存在,并且不会保持对连接的引用,因此它不会影响垃圾回收。

这是编码风格的问题。如果有一天你在finally块之后添加更多代码,那么有一个小优势。然后很明显你不能再使用jdbc了,因为它已被JDBCManager释放了。

是的,优良作法是取消对已处置资源的引用。

答案 4 :(得分:1)

已经写好了,在这种情况下它是没用的,因为该方法在最后一个之后结束 我会这样做,如果在try-finally之后有代码,最终会阻止它的使用。并且(非常罕见)可以提供帮助的情况 看看这篇文章:Java Memory Puzzle

答案 5 :(得分:0)

然后他应该在返回之前将所有局部变量设置为null。

JVM可能无论如何都会对线路进行优化,因此它没有任何运行时效果。

答案 6 :(得分:-2)

如果在finally块之后会有更多代码而不是仅仅结束方法,那么它可能有助于垃圾收集器清理它。