在一个项目里写了一个对数据库操作的线程import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Database extends Thread {
// 声明服务、客户端线程
//ClientThread clientThread;
ServerThread serverThread;
// 字符串
private String str=null;
private String[] str_str=null;
private String longitude=null;
private String latitude=null;
String driver = "com.mysql.jdbc.Driver"; // URL指向要访问的数据库名scutcs String url = "jdbc:mysql://127.0.0.1:3306/TEST1"; // MySQL配置时的用户名 String user = "root"; // Java连接MySQL配置时的密码 String password = "root"; Connection conn=null;
Statement statement;
// 构造函数
public Database(ServerThread serverThread) {
this.serverThread = serverThread;
//驱动程序名 try { // 加载驱动程序 Class.forName(driver); // 连续数据库 Connection conn = DriverManager.getConnection(url, user, password); if(!conn.isClosed()){
System.out.println("Succeeded connecting to the Database!");

}
statement = conn.createStatement();

}catch(ClassNotFoundException e) {   
System.out.println("Sorry,can`t find the Driver!");   
e.printStackTrace();   
} catch(SQLException e) {   
e.printStackTrace();   
} catch(Exception e) {   
e.printStackTrace();   
}  
 

} // 运行
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while (true) {


synchronized (serverThread.messages) {
synchronized (serverThread.imsgflag) {
if (serverThread.imsgflag==1)
{
str = (String) this.serverThread.messages.firstElement();
str_str=str.split("\\|");
if(str_str.length==5){
System.out.println("来自数据库的资源");

longitude=str_str[3];
latitude=str_str[4];


try { /*// 加载驱动程序 Class.forName(driver); // 连续数据库 conn = DriverManager.getConnection(url, user, password); if(!conn.isClosed()){
System.out.println("Succeeded connecting to the Database!");

}

Statement statement=conn.createStatement();*/
String sql2 = "INSERT INTO posi (longitude,latitude) VALUES ('"+longitude+"','"+latitude+"')";
//('"+p_id+"','"+parent+"','"+child+"','"+c_id+"')";
//statement.executeUpdate(sql2);
//String sql2 = "INSERT INTO position (X,Y) VALUES ('"+"23"+"','"+"43"+"')";

statement.executeUpdate(sql2);

//conn.close();
} catch(SQLException e) {   
e.printStackTrace();   
} catch(Exception e) {   
e.printStackTrace(); 
System.out.println("数据库被关闭");
}  

}
serverThread.imsgflag=0;
}
}
 
}


}
}
public void closedb() 
{
try{

conn.close();
System.out.println("成功关闭");
}catch(SQLException e){
e.printStackTrace(); 

}

}}
原本是每当serverThread.imsgflag=1的时候就建立数据库的连接,操作数据库,然后关闭(就是注释掉的部分)
可是这样对数据库的连接断开太频繁
于是就把建立连接的步骤放在了这个类的构造函数里
在其他程序里没建立一个该类对象就自动建立数据库连接,在run()方法里也不关闭连接,而是写了一个closedb()的函数
在其他程序里调用这个函数就会调运conn.close()可是这个时候为什么会出现空指针错误
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Database.closedb(Database.java:135)
at Server.actionPerformed(Server.java:63)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
135行就是conn.close()哪一行
server是调用它的程序这个空指针是什么意思
是因为,在这个线程结束的时候已经自动关闭连接了吗
可是从网上找的答案好像都说得自己关闭
很迷惑,求解答

解决方案 »

  1.   

    你全局的Connection conn=null;而你的closedb方法没任何传递参数、
    你把全局conn给close了;
    而这个全局的conn一直是为null的、当然会出空指针异常、
    把你的方法适当的修改一下就可以了 public void closedb(Connection conn) {
       conn.close();//自己try catch
     }用的时候把需要关闭的conn 传递里就可以了、
      

  2.   

    挂个连接池就完了,为什么干这么复杂,  conn.close(); 必须写在一个try里边
      

  3.   

    conn是个全局的,第一次完成后就关闭了。。第二次就木有conn了。
    放在其他类调用,他怎么知道是哪个conn要关闭呢。。