只有第一次联系被删除

时间:2011-03-13 16:23:46

标签: java serialization

这是我的代码段。 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");
  }   
} 

2 个答案:

答案 0 :(得分:1)

正确缩进代码后,它变得更加明显......

  • 您正在循环中重新创建(并重新读取)该文件,而不是之后 - 为什么?
  • 每次删除后都会写出一个新的JTable对象。
    • 为什么要写出来?
    • 你是怎么看的?
  • 此外,循环中有两个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 ++(可能是一段时间之前?)。仅适用于奇数元素索引。