线程“Thread-4”中的异常java.lang.NullPointerException?

时间:2012-05-06 16:38:46

标签: multithreading swing nullpointerexception

我遇到此异常的问题。 我正在尝试创建一个函数来显示数据库中的数据,我在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

2 个答案:

答案 0 :(得分:1)

NullPointerException是使用调试器修复的最简单的方法。只需在该行上放置一个断点,看看null是什么。

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

注意:

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

答案 1 :(得分:0)

显然stmt为空。

你在这里声明:

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

但是我没有在任何地方看到任何初始化代码,所以很可能它对于这个方法调用仍然是null:

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