-1

我有这个例外的问题。我正在尝试创建一个函数来在表上显示数据库中的数据,我在 jtextfield 所做的每一次击键。所以它就像每次我在 jtextfield 中键入时都会用新数据自动刷新表一样。

这是代码:

首先我有这个变量:

private Statement stmt;
List<Barang> dataSBarang =new LinkedList();
boolean searchBarang=true;
Searching sBarang;

这就是我调用函数的方式:

private void inputkodeTFMouseClicked(java.awt.event.MouseEvent evt){                                         
    sBarang = new Searching( stmt, dataSBarang, modelDetail, tabelDetailBarang, inputkodeTF, searchBarang);
    sBarang.start();
}  

这是搜索对象

public class Searching extends Thread{
private Statement stmt;
private List<Barang> dataBarang;
private JTable jTabelBarang;
private JTextField tf;
private boolean cari;
private DefaultTableModel modelBarang;

public Searching(Statement stmt, List<Barang> dataBarang, DefaultTableModel tm, JTable jTabelBarang, JTextField tf, boolean cari){
   this.stmt=stmt;
   this.dataBarang=dataBarang;
   this.modelBarang=tm;
   this.jTabelBarang=jTabelBarang;
   this.tf=tf;
   this.cari=cari;

}


@Override
public void run(){
    String temp="";
    while(cari==true){
    //System.out.println("jalan");
    try{
        String masukan = tf.getText();
        System.out.println(masukan);
    if(!masukan.equals("")&&!masukan.equals(temp)){
        clearTableBarang();
        //System.out.println("Mencari "+ masukan);
        ResultSet rs = stmt.executeQuery("select kode_barang, nama_barang, jumlah_stok, " +
            "minimal_stok, harga_jual, deskripsi_barang from BARANG WHERE (kode_barang LIKE " +
            "'"+masukan+"%')");
        System.out.println(rs);

        while(rs.next()){
            String kode_barang = rs.getString ("kode_barang");
            String nama_barang = rs.getString ("nama_barang");
            int jumlah_stok = rs.getInt("jumlah_stok");
            int minimal_stok = rs.getInt("minimal_stok");
            int harga_jual = rs.getInt("harga_jual");
            String deskripsi_barang = rs.getString ("deskripsi_barang");
            //System.out.println(kode_barang+" "+deskripsi_barang);

            dataBarang.add(new Barang(kode_barang,nama_barang,jumlah_stok,minimal_stok,harga_jual,deskripsi_barang));

            ((DefaultTableModel) jTabelBarang.getModel()).insertRow(jTabelBarang.getRowCount(), new Object[]{kode_barang, nama_barang, jumlah_stok, minimal_stok, harga_jual, deskripsi_barang});



        }
        temp = masukan;
    }
    else if(masukan.equals("")&&!masukan.equals(temp)) {
        clearTableBarang();
        showTableBarang();
        temp = masukan;
    }
    } catch(SQLException s){s.printStackTrace();}
    catch(ArrayIndexOutOfBoundsException s){s.printStackTrace();}
    try {
        sleep(500);

} catch(InterruptedException e){}

    }
}
public void clearTableBarang(){
    int numrows = modelBarang.getRowCount();
    for(int i = numrows - 1; i >=0; i--){
        modelBarang.removeRow(i);
    }

    dataBarang.clear();


}
public void showTableBarang(){
    try{
    ResultSet rs = stmt.executeQuery("select kode_barang, nama_barang, jumlah_stok, minimal_stok, harga_jual, deskripsi_barang from barang");
    while(rs.next()){
            String kode_barang = rs.getString ("kode_barang");
            String nama_barang = rs.getString ("nama_barang");
            int jumlah_stok = rs.getInt("jumlah_stok");
            int minimal_stok = rs.getInt("minimal_stok");
            int harga_jual = rs.getInt("harga_jual");
            String deskripsi_barang = rs.getString ("deskripsi_barang");
            //System.out.println(kode_barang+" "+deskripsi_barang);

            dataBarang.add(new Barang(kode_barang,nama_barang,jumlah_stok,minimal_stok,harga_jual,deskripsi_barang));

            ((DefaultTableModel)jTabelBarang.getModel()).insertRow(jTabelBarang.getRowCount(), new Object[]{kode_barang, nama_barang, jumlah_stok, minimal_stok, harga_jual, deskripsi_barang});

    }
    } catch(SQLException s){s.printStackTrace();}
}
public void delay(){
    try {
        sleep(1000000000);

} catch(InterruptedException e){}
}

}

这是错误:

Exception in thread "Thread-4" java.lang.NullPointerException
    at mypkg.Searching.run(Searching.java:47)

仅供参考:第 47 行指向

ResultSet rs = stmt.executeQuery("select kode_barang, nama_barang, jumlah_stok, " +
"minimal_stok, harga_jual, deskripsi_barang from BARANG WHERE (kode_barang LIKE " +
"'"+masukan+"%')");

请帮我解决问题。非常感谢你。:D

4

2 回答 2

1

NullPointerExceptions 是最容易用调试器修复的。只需在该行上放置一个断点,看看是什么null

如果您发布的行是正确的,您甚至不需要调试器,因为唯一可以引发异常的stmtnull.

笔记:

  • Thread单独运行数据库查询以避免阻塞 UI是一件好事。但是,在您的情况下,您正在从Thread不允许的 UI 更新 UI,这会导致奇怪的问题。所有 Swing 组件都必须在事件调度线程 (EDT) 上访问。有关更多信息,请参阅Swing 并发教程
  • 我确实希望您不会Thread像您在问题中指出的那样在文本字段中的每个按键上单独启动。查看 中的代码Thread,您从表中删除所有元素,然后重新添加行。因此,如果用户以正常的打字速度输入 5 个字符,您将启动 5 个线程,这些线程很可能同时运行(因为如果您的网络滞后,数据库连接可能不会那么快)。这意味着使用您当前的代码 5 个线程同时删除表模型并添加行。即使您将所有 Swing 代码都放在 EDT 上(请参阅我的第一点),您最终仍然会在 EDT 上发布可运行的 5 个线程,从而弄乱您的表模型。我不知道结果表模型是什么,但可能不是你想要的
于 2012-05-06T16:45:01.527 回答
0

显然stmt是空的。

你在这里声明它:

private Statement stmt;
List<Barang> dataSBarang =new LinkedList();
boolean searchBarang=true;
Searching sBarang;

但是我在任何地方都看不到任何初始化代码,因此该方法调用很可能仍然为空:

private void inputkodeTFMouseClicked(java.awt.event.MouseEvent evt){                                         
    sBarang = new Searching( stmt, dataSBarang, modelDetail, tabelDetailBarang, inputkodeTF, searchBarang);
    sBarang.start();
}  
于 2012-05-06T17:08:19.237 回答