2

我越来越

Exception in thread "main" java.lang.NullPointerException
    at java.io.FileOutputStream.<init>(FileOutputStream.java:201)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:99)
    at lib.Entry.serialize(Entry.java:17)
    at main.Main.main(Main.java:8)

在哪里Entry.java:17stream.writeObject(this);见下文)

入口.java

package lib;
import java.io.*;

public class Entry { // Superclass.

    String filename; // Set below.
    String name; // Set by the subclass.

    public void main() {
        this.filename = this.name + ".ser";
        serialize();
    }

    public void serialize() {           
        try {
            FileOutputStream file = new FileOutputStream(this.filename);
            ObjectOutputStream stream = new ObjectOutputStream(file);
            stream.writeObject(this);
            stream.close();
            file.close();
            System.out.println("Serialized.");
        } catch(IOException e) {
            e.printStackTrace();
        }
    }

}

Place.java

package lib;

public class Place extends lib.Entry { // A subclass.

    public String name;

    public Place(String name) {
        this.name = name;
    }

}

主.java

package main;
import lib.Place;

public abstract class Main {

    public static void main(String[] args) {
        Place room = new Place("room");
        room.serialize();
    }

}

为什么我NullPointerException在使用时得到一个this?我正在尝试将当前对象实例写入ObjectOutputStream. 我是 Java 新手,我不知道如何继续。在 Python 中,我会按照我在 Java 中stream.writeObject(self)使用的相同思路来使用类似的东西。this我尝试使用stream.writeObject(Object this);,但它没有用。我也试过

Object p = this;
stream.writeObject(p);

我猜是一样的。它也没有工作。这个想法是有更多的类(除了Place)扩展,允许使用该方法Entry对它们进行序列化。Entry.serialize()

4

2 回答 2

3
String name; // Set by the subclass.

那就是问题所在。由于您在子类中重新定义了name字段,它将不再使用this.name. 类中的name字段会Place影响类中声明的字段Entry

namePlace类中删除声明。

然后用参数化的构造函数替换类中的main()方法。Entry我不知道你为什么首先拥有它。你甚至都不叫它。

public Entry(String name) {
    this.name = name;
    this.filename = this.name + ".ser";

    // Don't call it here. Your object hasn't been fully constructed yet.
    // serialize();  
}

然后从构造函数调用超类构造Place函数,而不是直接设置字段:

public Place(String name) {
    super(name);
}

最后,让你的Place类实现Serializable接口。请记住,您正在序列化它的实例。

于 2013-08-09T00:52:19.747 回答
1

Entry#main()没有被调用,因为现在Main#main()是你的main()方法。您需要添加一个构造函数,将类中的文件名初始化为Entry

   public Entry() {
        this.filename = this.name + ".ser";
    }
于 2013-08-09T00:48:16.163 回答