日期:2014-05-20  浏览次数:20794 次

数据库操作代码异常,请高手帮忙找问题所在。
这是按照老师在课堂上打的代码照打下来的,但是打完因为时间关系老师没有演示,小弟回来后自己一模一样的打了下来,不知道是老师漏了什么,运行起来却发现有Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException异常。提示的是窗口类中的ms.ExecuteSql(sql);和MySql类里面的ExecuteSql(String sql)方法里面的stm.executeUpdate(sql);麻烦帮小弟分析下这个代码。谢谢!
窗口类代码如下:
Java code

private MySql ms = new MySql();
//省略部分无关代码
btnSave.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                String sql = "INSERT INTO student VALUES("+txtId.getText()+",'"+txtName.getText()+"');";
                ms.ExecuteSql(sql);
                ms.closeConnection();
                showStu();
            }
            
        });

MySql类代码如下:
Java code
public class MySql {
    private Connection conn =null;
    private final String DB_DRIVER="com.mysql.jdbc.Driver";
    private final String DB_URL="jdbc:mysql://localhost:3306/school";
    private final String DB_USER="root";
    private final String DB_PWD="root";
    public MySql(){}
    public void getConnection(){
        try {
            Class.forName(DB_DRIVER);
            Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void closeConnection(){
        try {
            if(conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public boolean ExecuteSql(String sql){
        int rt=0;
        if(conn==null){
            getConnection();
        }
        try {
            Statement stm = conn.createStatement();
            stm.executeUpdate(sql);
            //stm.close();
                        //不管有没有这个close都会有异常
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(rt==0){
            return false;
        }else{
            return true;
        }
        
    }


------解决方案--------------------
可能是conn.createStatement();的时候返回null,因为你在使用完没有及时摧毁?所以连接数过多?

另外建议你用prepareStatement....防止sql注入以及在查询前预编译成数据库需要的语言,查询的时候更快
------解决方案--------------------
private MySql ms = new MySql();
btnSave.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
try{

String sql = "INSERT INTO student VALUES("+txtId.getText()+","+txtName.getText()+")";
ms.ExecuteSql(sql);
ms.closeConnection();
showStu();
}
}catch(SQLException e){};
});

试试我这个方法行不,如果不行你好好检查一下;这个NullPointerException异常可能是空指针异常,说不定你代码少打了。