2 ss137518 ss137518 于 2014.07.15 15:17 提问

想将数据库的数据调入容器中但显示空指针。所以想问下该怎么解决

public class Wenben extends JFrame implements TableModelListener{
JTable table;
Vectorhang;
Vector lie;//fang 4ge
Vector h1;

//数据调用

public void dy(){   
    lie.add("ID");
    lie.add("name");
    lie.add("time");
    lie.add("money");

    String url = "jdbc:odbc:uaccess";// 根据数据源,设置数据库URL
    String userName = "sh";// 登录数据库用户名
    String password = "sh";// 用户密码
    Connection conn = null;// 声明Connection对象
    Statement stmt = null;// 声明Statement对象

    try {
    // 加载JDBC-ODBC驱动程序
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    // 创建连接
        conn = DriverManager.getConnection(url);//("jdbc:odbc:driver={microsoft access driver (*.mdb)};dbq=d:/user/2011级计算机系学生信息.mdb");   
    // 通过Connection对象,创建Statement对象
        stmt = conn.createStatement();

    // 执行查询"年龄为20岁的学生信息"的SQL语句,得到结果集
        ResultSet rs = stmt.executeQuery("select * from 员工信息表 ");

    // 通过循环输出相关学生信息
        /*
           System.out.println("学号" + "\t\t姓名" + "\t性别" + "\t出生日期"+ "\t年龄" + "\t专业方向"
            + "\t\t\t宿舍");
            */
        while (rs.next()) {
            String id = rs.getString("ID");
            String name = rs.getString("姓名");
            String time = rs.getString("时间");
            int money=rs.getInt("金钱");

            h1.add(id); 
            h1.add(name);
            h1.add(time);   
            h1.add(money);
            hang.add(h1);

            System.out.println(id + "\t" + name + "\t" + time + "\t" + money
                + "\t");
        }   rs.close(); // 关闭结果集
        stmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
}

//数据调用结束
public Wenben(){
    super("JTable测试");
    TableModel model=new DefaultTableModel(hang,lie);   
    model.addTableModelListener(this);
    table=new JTable(model);
    table.setFillsViewportHeight(true);
    table.setAutoCreateRowSorter(true);


    getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
    /*setSize(300, 200);setVisible(true);validate();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/
}

public void tableChanged(TableModelEvent e){

}
public static void main(String args[]){
    Wenben wb=new Wenben();
    wb.dy();
}

}

2个回答

leaze215
leaze215   2014.07.16 11:39

Vector hang; Vector lie; Vector h1; 这三项都没有初始化,直接调用Vector.add()一定是空指针。

应该Vector hang = new Vector(); Vector lie = new Vector();

另外, ResultSet循环体里用的h1都是同一个Vector对象,应该每行数据初始一个Vector,放入hang中。

zyj905411
zyj905411   2014.07.17 11:26

问题1:Vector没有进行初始化,当然也就发生空指针一场了,其中全局变量hang和lie都应该new一次Vector hang = new Vector(); Vector lie = new Vector();
问题2:逻辑问题,h1作为保存数据库每一行的记录,最好作为局部变量,并且放在while (rs.next()) {}这个循环语句中,每次循环,都new一个新的对象,再将该对象放入hang变量中。将开头的Vector h1去掉,而在while循环中增减Vector h1 = new Vector();
问题3:优化问题,关闭数据库连接最好放在try语句块中,因为如果发生异常,数据库岂不是不用关闭?应当在catch语句块后面增加finally,将关闭数据库连接放在finally中,这样即使前面发生异常,finally中的语句还是可以正常执行的,数据库就可以及时关闭了

Csdn user default icon
上传中...
上传图片
插入图片