Java 运行时错误NoSuchMethodError

Java 运行时错误NoSuchMethodError,java,nosuchmethoderror,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

即将到来的错误是

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

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;
}
线程“main”java.lang.NoSuchMethodError:Dog中出现异常。(ILjava/lang/String;)V 位于SuperNotSerial.main(SuperNotSerial.java:5)
添加到fge中,回答您缺少序列化所需的无参数构造函数

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

现在,当我们尝试反序列化对象时,无法从流中还原不可序列化的超类(构造对象的确切状态所需的超类)的状态,而是通过调用无参数构造函数来还原

当第一个不可序列化类的无参数构造函数不可访问时,会引发异常“InvalidClassException:无有效构造函数”

正如我们所知,默认情况下,每个Java类都有一个无参数构造函数。那么,有时它怎么可能无法访问呢


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

在fge中添加一个答案,即缺少序列化所需的无参数构造函数

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

现在,当我们尝试反序列化对象时,无法从流中还原不可序列化的超类(构造对象的确切状态所需的超类)的状态,而是通过调用无参数构造函数来还原

当第一个不可序列化类的无参数构造函数不可访问时,会引发异常“InvalidClassException:无有效构造函数”

正如我们所知,默认情况下,每个Java类都有一个无参数构造函数。那么,有时它怎么可能无法访问呢


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

这在我看来不像是编译器错误。对我来说也适用。我在线程“main”java.lang.NoSuchMethodError:main中的Fido 42异常之前:Fido 35之后将其输出。。在前面的讨论中:对我来说,这不像是一个编译器错误。对我来说也适用。我在线程“main”java.lang.NoSuchMethodError:main中的Fido 42异常之前:Fido 35之后将其输出。。前面的讨论是:如果我们不声明系统自己创建的arg构造函数,那么就没有人。现在程序正在运行。@如果您至少定义了一个替代构造函数,则没有默认的无参数构造函数。请用准确的代码来解决这个问题,
Animal
Dog
是什么(同一个文件?不同的文件?)等等。很明显,你粘贴的代码不是你运行的导致错误的代码。伙计们,我想这是我的eclipse出现了一些问题,现在代码工作正常了@fge这和我得到的代码是一样的error@JunedAhsan不可序列化的超类不需要arg构造函数或序列化不需要arg构造函数。如果我们不声明系统自己创建的arg构造函数,那么就看不到任何人。现在程序正在运行。@如果您至少定义了一个替代构造函数,则没有默认的无参数构造函数。请用准确的代码来解决这个问题,
Animal
Dog
是什么(同一个文件?不同的文件?)等等。很明显,你粘贴的代码不是你运行的导致错误的代码。伙计们,我想这是我的eclipse出现了一些问题,现在代码工作正常了@fge这和我得到的代码是一样的error@JunedAhsan不可序列化的超类不需要arg构造函数或序列化不需要arg构造函数。看见
Exception in thread "main" java.lang.NoSuchMethodError: Dog.<init>        (ILjava/lang/String;)V
at SuperNotSerial.main(SuperNotSerial.java:5)