アップデート
多大な支援をいただきありがとうございます。ここで、例外に関する考えられる理由を1つ追加する必要があります。
ドメイン クラス (以下の大学のクラスなど) にreadObject()
とを追加し、さらに main() メソッドでメソッドを呼び出す必要がある場合は、次のことを確認してください。writeObject()
ObjectOutputStream.writeObject()
ObjectOutputStream.close()
---メソッドをドメイン クラスに配置しないでください。オブジェクトが閉じられているため、そのオブジェクトを操作することは違法であるため、例外が発生します (プログラムがファイルを読み取ったり、既に閉じられているファイルを閉じたりするにはどうすればよいでしょうか?)。
マイナーな問題であることはわかっていますが、例外はそれについて何も伝えないため、デバッグするのは非常に微妙です。だから、これは記録のために少し頭を上げています。
単純なスニペットを実装して、一時オブジェクトのプリミティブ フィールドをシリアル化し、ObjectInputStream によってそれらのプリミティブ フィールドを逆シリアル化し、最終的にそれらを使用して新しいオブジェクトを作成します。シナリオは次のようになります。
public class College implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient City city; //transient
private String zipCode;
// constructors & getter/setters
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeInt(city.getCode());
os.writeInt(city.getPopulation());
os.writeObject(city.getName());
os.flush();
os.close(); // update: not good practice, may throw exception.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void readObject(ObjectInputStream os){
try {
os.defaultReadObject();
int code = os.readInt();
int population = os.readInt();
String name = (String)os.readObject();
City theCity = new City(code, name, population);
System.out.println(theCity.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
シティクラスはこちら
public class City {
// the primitive & String fields
private int code;
private String name;
private int population;
// getter/setters
}
そして、ここにオブジェクトを読み書きするための素敵なコードがありcollege
ます(少し分厚いです、ごめんなさい)
public class GeneralTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
City city = new City(375, "New York", 380897);
College college = new College("NYU", city, "10289");
College readCollege = null;
City readCity = null;
System.out.println("Before serialization -- City: ["+city.toString()+"], College: ["+college.toString()+"]");
try {
FileOutputStream fs = new FileOutputStream("college.foo");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(college);
os.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("college.foo");
ObjectInputStream ois = new ObjectInputStream(fis);
readCollege = (College)ois.readObject();
//get values to compose a city object
int id = ois.readInt();
int population = ois.readInt();
String name = ois.readUTF();
readCity = new City(id, name, population);
ois.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("After serialization -- City: ["+readCity.toString()+"], College: ["+readCollege.toString()+"]");
}
}
そして、私はこの例外を受け取り、readCollege
andreadCity
は明らかにnullです:(
java.io.IOException: Write error
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:282)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756)
at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1257)
at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1211)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1395)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:333)
at serialized.GeneralTest.main(GeneralTest.java:27)
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2721)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFChar(ObjectInputStream.java:3113)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3010)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2819)
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1050)
at serialized.College.readObject(College.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at serialized.GeneralTest.main(GeneralTest.java:40)
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1899)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1873)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at serialized.GeneralTest.main(GeneralTest.java:40)
Exception in thread "main" java.lang.NullPointerException
at serialized.GeneralTest.main(GeneralTest.java:52)
何か案は?前もって感謝します。