Java中将ArrayList元素赋值为null

3
我有以下代码:

static ArrayList<PreparedStatement> alPrepStmts = new ArrayList<PreparedStatement>();

static PreparedStatement m_stmtOne;
static PreparedStatement m_stmtTwo;
static PreparedStatement m_stmtThree;
...
static PreparedStatement m_stmtOneHundred;

private static void init() {
    alPrepStmts.add(m_stmtOne);
    alPrepStmts.add(m_stmtTwo);
    alPrepStmts.add(m_stmtThree);
    ...
    alPrepStmts.add(m_stmtOneHundred);
}

private static void work() {
    if(m_stmtOne == null) {
        // assign m_stmtOne
    }
    // use m_stmtOne
}

private static void close() throws SQLException {
    for(PreparedStatement ps : alPrepStmts) {
        if(ps != null) {
            ps.close();
            ps = null;
        }
    }
}

init()函数只会被调用一次。work()和close()函数可能会被多次调用。问题在于,在调用close()函数之后,PreparedStatements并没有被设置为null。下一次调用work()函数时,m_stmtOne不是null,但是已经关闭了。我想我可以检查m_stmtOne是否打开,但是我想知道如何将容器的成员赋值为null。

我还尝试使用迭代器,但也不起作用。下面的if条件永远不会成立。

private static void ClosePreparedStatements() throws SQLException {
    for(Iterator<PreparedStatement> it = alPrepStmts.iterator(); it.hasNext();) {
        PreparedStatement ps = (PreparedStatement)it.next();
        if(ps != null) {
            ps.close();
            ps = null;
        }
    }
}

我知道我可以手动关闭和分配每个语句,但我只是想知道将null分配给容器中的元素的最佳方法是什么。


你在问题中提供的代码不可能按照你所描述的方式运作。首先,给出的init()方法仅用100个null条目填充alPrepStatements - Stephen C
是的,我不得不回去阅读有关变量引用的内容。我需要将PreparedStatements作为成员变量来检查它们是否为空,然后再准备它们;我认为每次准备它们并不高效?我将它们放在列表中,因为我想循环遍历列表来关闭它们,而不是手动编写每个关闭并重新分配为null。我已经决定最简单的解决方案就是手动编写所有关闭和重新分配的代码。 - foamboarder
4个回答

4
您的任务ps = null仅分配本地变量,而不修改原始容器。您应该在第二个代码片段中使用java.util.Iteratorremove方法(而不是ps = null)来从容器中删除元素。请注意,这将从容器中删除元素,而不是用null替换容器中的元素。
即使您从容器中删除了元素,它也不会改变例如m_stmtOne的值,这似乎也是您想要发生的。您必须以其他方式完成此操作。
另外,init()似乎只向您的预处理语句列表添加了100个null。稍后将非空值分配给m_stmtOne不会更改列表。换句话说,m_stmtOne按值而不是按引用添加到列表中。

0
一种方法是:
for(int i = 0; i < alPrepStmts.size(); i++) {
    if(alPrepStmts.get(i) != null) {
        alPrepStmts.get(i).close()
        alPrepStmts.set(i, null);
    }
}

顺便提一下,如果你有一个 List<PreparedStatement>,你不需要将每个条目强制转换为 PreparedStatement。这正是 Java 泛型的用途。



0

for语句创建了一个局部作用域变量。你将其设置为null,但这并不会将列表元素或类成员变量引用设置为null,正如你可能已经意识到的那样。

编辑:我越看这段代码,就越不明白它的意图是什么。


我只想通过迭代列表将类成员变量设置为null。 - foamboarder
没有使用反射是无法做到那样的,而那也不是你想要的。理解你的问题需要更好地了解Java中的变量引用。根据问题中展示的代码,它并没有太多意义。通常情况下,你不会在持有相同对象的列表中还持有显式成员变量引用。你是否有特定的原因想要为每个预处理语句拥有一个成员变量?为什么不只是将它们保留在列表中,而且仅仅保留在列表中呢? - kaliatech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接