-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

ノート:

  • ThreadUIのブロックを回避するために、DBクエリを個別に実行することをお勧めします。ただし、あなたの場合、Thread許可されていないUIから更新しているため、奇妙な問題が発生します。すべてのSwingコンポーネントは、イベントディスパッチスレッド(EDT)でアクセスする必要があります。詳細については、Swing同時実行チュートリアルを参照してください
  • Thread質問で示したように、テキストフィールドのキーストロークごとに個別に起動しないことを願っています。のコードを見てThread、テーブルからすべての要素を削除してから、行を再度追加します。したがって、ユーザーが通常の入力速度で5文字を入力すると、5つのスレッドが起動します。これらのスレッドは、すべて同時に実行される可能性があります(ネットワークが遅れている場合、DB接続はそれほど高速ではない可能性があるため)。つまり、現在のコードでは、5つのスレッドが同時に、テーブルモデルを削除し、行を追加しています。すべてのSwingコードをEDTに配置した場合でも(私の最初のポイントを参照)、5つのスレッドがEDTにランナブルを投稿してテーブルモデルを混乱させることになります。結果のテーブルモデルがどうなるかはわかりませんが、おそらくあなたが望むものではありません
于 2012-05-06T16:45:01.527 に答える
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();
}  
于 2012-05-06T17:08:19.237 に答える