Multithreading “线程中的异常”;螺纹-4“;java.lang.NullPointerException?
我对这个例外有个问题。 我正试图创建一个函数来在表上显示数据库中的数据,每次我在jtextfield上击键。因此,每当我在jtextfield中键入新数据时,表就会自动刷新 代码如下: 首先我有一个变量: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
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();
}