【问题标题】:Array doesn't save info数组不保存信息
【发布时间】:2016-05-20 17:32:54
【问题描述】:

我的代码过去可以正常工作,我的对象已正确保存到数组中,但现在它无法正常工作,尽管事实上我还有一段相同的代码可以工作。这是它最初的样子:

 if (a == 2) {    
        ObjectOutputStream utström = new ObjectOutputStream
                (new FileOutputStream("register.data"));
        int n = 0;
        while (true) { 
            j[n] = new nyHund();
            String s1 = JOptionPane.showInputDialog("Hundens namn?");
                if (s1 == null)
                        break;
                j[n].namn = s1;
                s1 = JOptionPane.showInputDialog("Hundens mor?");
                j[n].mor = s1;
                s1 = JOptionPane.showInputDialog("Hundens far?");
                j[n].far = s1;
                    }
            n++;    
                }

        utström.writeObject(j);
        utström.close();
    }

当我输入时:

JOptionPane.showMessageDialog(null, j[n].namn + j[n].mor + j[n].far);

在“write.object”之后它只是给了我“nullnullnull”,但是当我把它直接放在之后

 j[n].far = s1;

它有效。所以它只是不能正确保存。我试过删除、添加、移动大括号和代码,但它不起作用。我仍然怀疑它与牙套有关。 这是整个程序。我有本地输入/输出流之类的东西的原因是试图解决这个问题,一开始就声明它们不会做任何事情。是的,它非常基础,但这就像我在 Java 中做的第一件事。

import javax.swing.*;
import java.util.*;
import java.io.*;
public class Kennel2 {

public static void main(String[] args) throws IOException {


    Object [] fönster = {"Avregistrera hund","Registrera intressent",
    "Registrera hund"};
    int a = JOptionPane.showOptionDialog(null, "Välkommen till Hellbergs Kennel!",
            "Hellbergs Kennel", JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.QUESTION_MESSAGE, null, fönster, fönster[2]);
    nyIntr[]i = new nyIntr[100];
    nyHund[]j = new nyHund[100];
    boolean ok = true;


    if (a == 1) {
        ObjectOutputStream utström = new ObjectOutputStream
                (new FileOutputStream("register.data"));
        int n = 0;
        while (true) {   //Registrera ny intressent
            i[n] = new nyIntr();
            String s1 = JOptionPane.showInputDialog("Intressentens namn?");
            if (s1 == null)
                break;
            i[n].namn = s1;
            s1 = JOptionPane.showInputDialog("Intressentens telefonnummer?");
            i[n].tlfNr = s1;

            s1 = JOptionPane.showInputDialog("Vilken valp är hen intresserad av?");
            i[n].valp = new nyHund();
                if (i[n].valp.aktiv = true) {
                    j[n].intressent.namn = i[n].namn;
                    j[n].namn = i[n].valp.namn;
                }
            else {
                JOptionPane.showMessageDialog(null, "Denna hund är ej tillgänglig");
                    break;
                    }
            n++;    
                }
        JOptionPane.showMessageDialog(null, i[n].namn + i[n].tlfNr);
        utström.writeObject(i);
        utström.close();

}
 if (a == 0) {
        ObjectInputStream inström = new ObjectInputStream
                (new FileInputStream("register.data"));
        ObjectOutputStream utström = new ObjectOutputStream
                (new FileOutputStream("register.data"));

     Scanner data = new Scanner (new File("register.data"));
     int n = 0;
     while (data.hasNext()) {
         j[n] = new nyHund();
         j[n].namn = data.next();
         n++;
     }
     while (true) {
         String sökt = JOptionPane.showInputDialog("Vilken hund söker du?");
         if (sökt == null)
             break;
         int k = 0;
         for (; k<n; k++)
             if (j[n].namn.equals(sökt))
                 break;
         if (k < n) {
             j[n].aktiv = false;
         JOptionPane.showMessageDialog(null,  "Hunden är avaktiverad"); }
         else {
             JOptionPane.showMessageDialog(null, "Hunden kunde ej hittas");
             break; 
          }
         utström.writeObject(j);
         data.close();
         inström.close();
     utström.close();
     }

 }
 if (a == 2) {    
        ObjectOutputStream utström = new ObjectOutputStream
                (new FileOutputStream("register.data"));
        int n = 0;
        while (true) {   //Registrera ny hund

            String s1 = JOptionPane.showInputDialog("Hundens namn?");
                if (s1 == null)
                        break;
                j[n] = new nyHund();
                j[n].namn = s1;
                s1 = JOptionPane.showInputDialog("Hundens mor?");
                j[n].mor = s1;
                s1 = JOptionPane.showInputDialog("Hundens far?");
                j[n].far = s1;
                s1 = JOptionPane.showInputDialog("Hundens födelseår?");
                for (int k=1; k<s1.length(); k++) 
                    if (s1.charAt(k) < '0' || s1.charAt(k) > '9'){
                        ok = false;
                        JOptionPane.showMessageDialog(null, "Ogiltigt format");
                        break;
}
                else {
                int l = Integer.parseInt(s1);
                j[n].födelsedatum = l;
                    n++;
                    }

                }

        utström.writeObject(j);
        utström.close();
    }

}
}

【问题讨论】:

    标签: java arrays object save


    【解决方案1】:

    因为你的代码没有正确实现

    这是您的 while 循环,在其中您不会增加 n

       while (true) { 
            j[n] = new nyHund();
            String s1 = JOptionPane.showInputDialog("Hundens namn?");
                if (s1 == null)
                        break;
                j[n].namn = s1;
                s1 = JOptionPane.showInputDialog("Hundens mor?");
                j[n].mor = s1;
                s1 = JOptionPane.showInputDialog("Hundens far?");
                j[n].far = s1;
         }
    

    因此,您输入的所有值都位于 0 索引处,并且每次都被新对象替换。

    while 循环中断后,您将其递增到 1 n++ 并且在索引 1 处您没有任何值,因此您看到的是 null。

    要正确地将增量 n++ 放入您的 while 循环中并正确放置 new nyHund()

       while (true) { 
    
                String s1 = JOptionPane.showInputDialog("Hundens namn?");
                if (s1 == null)
                         break;
                j[n] = new nyHund();
                j[n].namn = s1;
                s1 = JOptionPane.showInputDialog("Hundens mor?");
                j[n].mor = s1;
                s1 = JOptionPane.showInputDialog("Hundens far?");
                j[n].far = s1;
                n++;
         }
    

    对于打印值,请使用正确的索引。

    希望对你有帮助。

    【讨论】:

    • 当我这样做时它只会给我 NullPointerException :/
    • 它在哪里给你 NPE?
    • 只有在 n++ 之后才起作用,所以问题是它不会保存
    • 删除您的 showMessageDialog 或在 showMessageDialog 之前执行 n--
    • 现在它可以工作了,但现在它只保存在插槽 0 中,并在我输入新信息时覆盖..
    【解决方案2】:

    在最后一次循环调用中,您已经迭代 n 超过了数组中的最后一个元素。如果您的数组包含 60 个元素 (0-59),则在循环结束后,n = 60,并且您将不会获得有意义的数据(因为您在为j[n])。

    要么在循环结束后添加n--,要么仅在创建新元素时迭代n

    【讨论】:

    • 也想到了,但是当我修复它时,它只会给我 NullPointerException
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多