在Java中将null分配给ArrayList项

在Java中将null分配给ArrayList项,java,null,arraylist,containers,Java,Null,Arraylist,Containers,我有以下代码: static ArrayList<PreparedStatement> alPrepStmts = new ArrayList<PreparedStatement>(); static PreparedStatement m_stmtOne; static PreparedStatement m_stmtTwo; static PreparedStatement m_stmtThree; ... static PreparedStatement m_st

我有以下代码:

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;
        }
    }
}
static ArrayList alPrepStmts=new ArrayList();
静态编制报表;
静态编制报表m_stmtTwo;
静态编制报表m_stmttree;
...
静态准备报表m_stmtOneHundred;
私有静态void init(){
alprepts.add(m_stmtOne);
alpreptstms.add(m_stmtTwo);
alpreptstms.add(m_stmtThree);
...
alpreptstms.add(m_stmtOneHundred);
}
私人静态无效工作(){
如果(m_stmtOne==null){
//分配m_stmtOne
}
//使用m_stmtOne
}
私有静态void close()引发SQLException{
对于(准备好的报表ps:alPrepStmts){
如果(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;
        }
    }
}
private static void ClosePreparedStatements()引发SQLException{
for(Iterator it=alprepsmts.Iterator();it.hasNext();){
PreparedStatement ps=(PreparedStatement)it.next();
如果(ps!=null){
ps.close();
ps=null;
}
}
}
我知道我可以手动关闭并分配每个语句,但我只是想知道为容器中的元素分配null的最佳方法是什么。

一种方法是:

for(int i = 0; i < alPrepStmts.size(); i++) {
    if(alPrepStmts.get(i) != null) {
        alPrepStmts.get(i).close()
        alPrepStmts.set(i, null);
    }
}
for(int i=0;i

顺便说一句,如果您有一个
列表
,则不需要将每个条目强制转换为
PreparedStatement
。这就是Java泛型最初的用途。

Java.util.Collections.fill(List您的赋值
ps=null
只赋值局部变量,它不会修改原始容器。您应该使用
Java.util.Iterator的
remove
方法(在您的第二个代码中,已剪切而不是
ps=null
)以从容器中删除元素。请注意,这将从容器中删除元素,而不是将其替换为容器中的null

java.util.Collections.fill(List<? super T> list, T obj);
即使您从容器中删除该元素,它也不会更改的值,例如,
m_stmtOne
,听起来您也希望这样做。您必须以其他方式进行此操作


它似乎也是
init()
只向准备好的语句列表中添加100个空值。稍后将非空值分配给
m_stmtOne
不会更改列表。换句话说,
m_stmtOne
将通过值而不是引用添加到列表中。

for语句正在创建一个局部范围的变量。您设置了该空值,但没有设置列表元素或类成员变量引用null,您可能已经意识到了这一点


编辑:我越是看这段代码,就越不理解它的作用。

您在问题中提供的代码不可能以您描述的方式运行。首先,
init()
给出的方法只是用100个
null
条目填充
alPrepStatements
。是的,我必须返回并阅读变量引用。我需要PreparedStatements作为成员变量,在准备它们之前检查它们是否为null;我相信每次准备它们都没有那么有效?我把它们放在一个列表中,因为我我想通过循环列表来关闭它们,而不是手动编码每个关闭并重新分配为null。我决定最简单的解决方案是手动编码所有关闭和重新分配。我只想通过迭代列表将类成员变量设置为null。如果不使用反射和其他方法,就无法做到这一点不是您想要的。理解您的问题需要更好地理解Java中的变量引用。问题中显示的代码没有多大意义。通常,除了在列表中保存这些相同的对象之外,您不会保存显式的成员变量引用。您想要拥有成员的具体原因是什么每个准备好的语句的变量?为什么不将它们保留在列表中,并且只保留在列表中?