Java Jdbc连接关闭和preparedstatement关闭

Java Jdbc连接关闭和preparedstatement关闭,java,jdbc,database-connection,prepared-statement,Java,Jdbc,Database Connection,Prepared Statement,嗨,我知道这是一个老问题,但只是好奇今天。正如我们所知,connection.close也将关闭preparedStatement(如果我错了,请更正我)。但如果我关闭连接,然后关闭准备好的声明呢 conn.close(); ps.close(); 我会得到一个空指针异常吗 有人说取决于您的jvm速度。有时ps.close()会在conn.close完成其工作之前提前运行并首先关闭,因此您不会得到null指针 为了测试这一点,我修改了代码 conn.close(); Thread.sleep(

嗨,我知道这是一个老问题,但只是好奇今天。正如我们所知,connection.close也将关闭preparedStatement(如果我错了,请更正我)。但如果我关闭连接,然后关闭准备好的声明呢

conn.close();
ps.close();
我会得到一个空指针异常吗

有人说取决于您的jvm速度。有时ps.close()会在conn.close完成其工作之前提前运行并首先关闭,因此您不会得到null指针

为了测试这一点,我修改了代码

conn.close();
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough
ps.close();
但是我没有得到空指针

所以我的问题是,如果我先关闭conn,然后关闭ps,这里会发生什么


谢谢大家。

JavaDoc for
语句。close()
声明:

对已关闭的
语句
对象调用方法
close
无效


我建议这意味着,如果您的语句已经通过调用
Connection.close()

按照javadoc of statement接口关闭,那么实现不应该抛出异常

close
void close()
           throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

因此,如果关闭已经关闭的语句,就不会有任何问题。

为什么会出现空指针异常?什么变量变为空?但是,您当然应该按照与获取相反的顺序关闭资源,在这种情况下,
连接之前的
PreparedStatement
(以及
PreparedStatement
之前的
ResultSet
)。