Multithreading “线程中的异常”;螺纹-4“;java.lang.NullPointerException?

Multithreading “线程中的异常”;螺纹-4“;java.lang.NullPointerException?,multithreading,swing,nullpointerexception,Multithreading,Swing,Nullpointerexception,我对这个例外有个问题。 我正试图创建一个函数来在表上显示数据库中的数据,每次我在jtextfield上击键。因此,每当我在jtextfield中键入新数据时,表就会自动刷新 代码如下: 首先我有一个变量: private Statement stmt; List<Barang> dataSBarang =new LinkedList(); boolean searchBarang=true; Searching sBarang; 这就是搜索对象 public class Searc

我对这个例外有个问题。 我正试图创建一个函数来在表上显示数据库中的数据,每次我在jtextfield上击键。因此,每当我在jtextfield中键入新数据时,表就会自动刷新

代码如下:

首先我有一个变量:

private Statement stmt;
List<Barang> dataSBarang =new LinkedList();
boolean searchBarang=true;
Searching sBarang;
这就是搜索对象

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){}
}
仅供参考:第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

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

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

注:

  • 最好在单独的
    线程中运行DB查询,以避免阻塞UI。但是,在您的情况下,您正在从该
    线程更新UI,这是不允许的,并且会导致奇怪的问题。必须在事件分派线程(EDT)上访问所有Swing组件。有关更多信息,请参阅
  • 我希望您不要像在问题中指出的那样,在文本字段中的每次击键都启动一个单独的
    线程。查看
    线程中的代码,从表中删除所有元素,然后重新添加行。因此,如果用户以正常的键入速度键入5个字符,您将启动5个线程,它们很可能同时运行(因为如果您的网络滞后,DB连接可能不会那么快)。这意味着在当前代码中,5个线程同时删除表模型和添加行。即使您将所有的Swing代码放在EDT上(请参阅我的第一点),最终仍然会有5个线程在EDT上发布runnables,这会使您的表模型变得混乱。我不知道生成的表模型是什么,但可能不是您想要的

    • 显然
      stmt
      为空

      你在这里申报:

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

      请告诉我们NPE是在哪一行体现出来的。您的代码也容易受到SQL注入的攻击。1。47号线在哪里?2.不要更新EDT之外的gui对象。Im sry Im noob,什么是NPE?@radik是NullPointerException的缩写NPE指向我创建的第一个结果集我尝试打印“masukan”,结果显示,但当我尝试打印rs时,它没有显示出来哦,我明白了,谢谢你的建议。我将设法找到另一种方法来做到这一点。非常感谢。谢谢你,罗宾,是的,我检查过了,stmt为空@我忘了更改它。非常感谢,谢谢你,都铎。我检查过了,现在好多了。非常感谢你。
      ResultSet rs = stmt.executeQuery("select kode_barang, nama_barang, jumlah_stok, " +
      "minimal_stok, harga_jual, deskripsi_barang from BARANG WHERE (kode_barang LIKE " +
      "'"+masukan+"%')");
      
      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();
      }