这是我的代码段。 data是Object类型的2D数组。我之前已经将数据保存在JTable中。现在我写了 删除条目的代码。但是如果通过此代码只有第一个条目从JTable中删除。
我无法理解背后的原因。
请帮助我。
-snippet:
public void deleteActionPerformed(ActionEvent ae) {
String delname=tf4.getText();
int c=0;
try {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("data.txt"));
data=(Object[][])ois.readObject();
for(;;c++) {
String x=(String)data[c][0];
if(x.equals(delname)) {
System.out.println("if working");
data[c][0]=null;
data[c][1]=null;
data[c][2]=null;
try {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("data.txt"));
oos.writeObject(data);
} catch(Exception exc) {
System.out.println("error deleting data from"+" "+c+" row");
}
c++;
JOptionPane.showMessageDialog(new JFrame(),"contact deleted");
try {
ObjectInputStream oist=new ObjectInputStream(new FileInputStream("data.txt"));
data=(Object[][])oist.readObject();
JTable tb=new JTable(data,headers);
ObjectOutputStream oost=new ObjectOutputStream(new FileOutputStream("contacts.txt"));
oost.writeObject(tb);
} catch(Exception exc) {
System.out.println("error updating after deleting");
}
}
else
System.out.println("else working");
}
} catch(Exception exc) {
System.out.println("error reading data.txt for deleting");
}
}
答案 0 :(得分:1)
正确缩进代码后,它变得更加明显......
c++
,因此跳过了数组的第二个元素。答案 1 :(得分:0)
在获取NullPointerException之前,您只能运行此算法一次删除
如果您在之前的游戏中删除了任何项目,则每次比较时都会获得NPE。
String x =(String)data [c] [0];
if(x.equals(delname)){
如果你做delname.equals(x)会更安全(假设你之前检查过delname不为null)或者在if之前检查x == null。
更好的解决方案是,在循环之后,将数组复制到没有已删除元素的新数组。更好的是,在反序列化对象之后,将它传递给List类并使用它,并且只将它传递回数组,以便在完成程序时序列化它(或者直接序列化List,如果可以的话)。
那就是说,我找不到任何适用于第一个元素而不是其他元素的东西。也许是当你运行测试时,你首先尝试使用第一个元素,然后在破坏数组以便你有一个NPE之后,你可以测试其他元素。
编辑:没有看到额外的c ++(可能是一段时间之前?)。仅适用于奇数元素索引。