运行时错误NoSuchMethodError

时间:2013-06-13 05:57:15

标签: java nosuchmethoderror

import java.io.*;

public class SuperNotSerial {
public static void main(String[] args) {
    Dog d = new Dog(35, "Fido");
    System.out.println("before: " + d.name + " " + d.weight);
    try {
        FileOutputStream fs = new FileOutputStream("testSer.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        os.writeObject(d);
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        FileInputStream fis = new FileInputStream("testSer.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        d = (Dog) ois.readObject();
        ois.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("after: " + d.name + " " + d.weight);
}
}

class Dog extends Animal implements Serializable {
String name;

Dog(int w, String n) {
    weight = w; // inherited
    name = n; // not inherited
}
}

class Animal { // not serializable !
int weight = 42;
}

即将发生的错误。

此错误是编译错误,我无法理解确切的原因

Exception in thread "main" java.lang.NoSuchMethodError: Dog.<init>        (ILjava/lang/String;)V
at SuperNotSerial.main(SuperNotSerial.java:5)

1 个答案:

答案 0 :(得分:1)

向fge回答添加缺少序列化所需的无参数构造函数。

要知道在序列化时需要无参构造函数,我们需要了解序列化发生的过程。序列化通过链接继承层次结构中的每个类,然后保存每个超类的状态直到达到第一个非序列化类来工作。

现在,当我们尝试反序列化对象时,无法从流中恢复非可序列化超类的状态(构造对象的确切状态所需的状态),而是通过调用no-arg构造函数。

当第一个非可序列化类的no-arg构造函数不可访问时,会出现问题,抛出异常'InvalidClassException:no valid constructor'。

正如我们所知,每个Java类都有一个no-arg构造函数。那么,有时候它怎么可能无法访问呢?

答案是:只有在类中没有声明其他带参数的构造函数时,才会调用默认的no-arg构造函数。在这种情况下,为了调用no-arg构造函数,我们需要单独声明它。