0

readObject()を使用してファイルから複合オブジェクトのデータを読み取る方法は? 私のコードは以下で、次のように出力されました

version=4
purpose is DEMO
value=4
Exception in thread "main" java.lang.NullPointerException
        at Serializations.readObj(PS_Task3.java:39)
        at PS_Task3.main(PS_Task3.java:46)
Press any key to continue . . .

//PS_Task3.java //これは私が実行しようとしたコードです。SerializationDemo の demo 型の変数を削除すると、正しい出力が得られました。しかし、複合クラスを試したときに NullPointerException が発生しました。私を助けてください..事前に感謝します

import java.io.*;
class SerializationDemo implements Serializable //composite class
{
public int value = 4;
public demo d1;
public String purpose="DEMO";
public int getValue(){
    return value;
}
}
class demo{
    private int demoval;
    demo(){
        demoval=10;
    }
    public int getValue(){
        return demoval;
    }
}
class Serializations {
    void writeObj()throws IOException{   //writes into file
        FileOutputStream fos = new FileOutputStream("temp1.bin");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        SerializationDemo sd = new SerializationDemo();
        oos.writeObject(sd);
        oos.flush();
        oos.close();
    }
    void readObj()throws IOException,ClassNotFoundException{ //reads from file
        FileInputStream fis = new FileInputStream("temp1.bin");
        ObjectInputStream oin = new ObjectInputStream(fis);
        SerializationDemo sd = (SerializationDemo) oin.readObject();
        System.out.println("version="+sd.value);
        System.out.println("purpose is "+sd.purpose);
        System.out.println("value="+sd.getValue());
        System.out.println("value="+sd.d1.getValue());
    }
}    
public class PS_Task3{
    public static void main(String args[]) throws IOException,ClassNotFoundException {
        Serializations s = new Serializations();
        s.writeObj();
        s.readObj();  //here i got the error
    }
}
4

2 に答える 2

0

シリアル化メカニズムがすべてのクラスで機能するには、ローカル メンバー変数がプリミティブ型またはシリアル化可能なオブジェクトである必要があります。

最初の問題は、シリアライズできないSerializationDemo型のメンバー変数を持つことです。demo

これで問題が解決するはずです:

class demo implements Serializable{
    private int demoval;
    demo(){
        demoval=10;
    }
    public int getValue(){
        return demoval;
    }
}

null 例外の原因となっている 2 番目の問題は、 の値を決して設定しないことですd1。シリアル化する前に必ず設定してください。そうしないと、逆シリアル化しようとすると、null からデモ クラスのインスタンスを作成しようとすることになります。簡単な修正は、デフォルトのコンストラクターを追加することです:

import java.io.*;
class SerializationDemo implements Serializable //composite class
{
    public SerializationDemo()
    {
        d1 = new demo();
    }
    public int value = 4;
    public demo d1;
    public String purpose="DEMO";
    public int getValue(){
    return value;
    }
}
于 2013-09-11T17:09:47.130 に答える
0

確認してくださいnull

void readObj()throws IOException,ClassNotFoundException{ //reads from file
       try{
        FileInputStream fis = new FileInputStream("temp1.bin");
        System.out.println("1->"+fis==null);
        ObjectInputStream oin = new ObjectInputStream(fis);
        System.out.println("2->"+oin==null);
        SerializationDemo sd = (SerializationDemo) oin.readObject();
        System.out.println("3->"+sd==null);
        System.out.println("version="+sd.value);
        System.out.println("purpose is "+sd.purpose);
        System.out.println("value="+sd.getValue());
        System.out.println("value="+sd.d1.getValue());
       }catch(Exception e)
         {
          System.out.println(e.toString);}
    }

where が実際に null になっていることを確認してから、そこで対処してください。

于 2013-09-11T16:51:59.553 に答える