错误信息的含义是什么?

时间:2013-08-13 09:32:14

标签: java

package example;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.Object;

class Utils {
    public static Object copy(Object oldObj) {
        Object obj = null;
        try {
            // Write the object out to a byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            out.writeObject(oldObj);
            out.flush();
            out.close();

            // Retrieve an input stream from the byte array and read
            // a copy of the object back in.
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream in = new ObjectInputStream(bis);
            obj = in.readObject();
        } catch (IOException e) {
            e.printStackTrace();   
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
        return obj;
    }
}

public class mytest {
    public static void main(String[] args) throws IOException {
        Object clonedObject = Utils.copy(new Object());
        clonedObject.notifyAll();
    }
}

上面的代码是通过将对象更改为字节数组来显示复制的深度。但myeclipse给出了以下错误信息,我不知道为什么。

java.io.NotSerializableException: java.lang.Object
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at example.Utils.copy(mytest.java:17)
    at example.mytest.main(mytest.java:37)
Exception in thread "main" java.lang.NullPointerException
    at example.mytest.main(mytest.java:38)
你可以帮忙吗?谢谢!

7 个答案:

答案 0 :(得分:1)

您的对象应该实现Serializable接口

提示:对于克隆对象,更好地实现Cloneable接口并使用object.clone()方法

答案 1 :(得分:1)

这意味着java.lang.Object不可序列化,它不会实现Serializable,可能是您将类Object的对象传递给您的方法。

答案 2 :(得分:1)

您正在尝试序列化而不是Serializable(也就是说,它没有实现接口Serializable)对象

试试这个:

Object clonedObject = Utils.copy(new String("Hello");

String课程为Serializable

答案 3 :(得分:1)

当你执行writeObject时,你编写的对象需要是Serializable。尝试将copy - 方法的签名更改为

public static Object copy(Serializable oldObj)

错误信息会更清晰。

答案 4 :(得分:0)

Object类未实现Serializable接口,因此无法直接与对象流一起使用。更多详情here

答案 5 :(得分:0)

来自ObjectOutputStream.writeObject的{​​{3}}:

  

抛出:

     

NotSerializableException - 要序列化的某些对象不实现java.io.Serializable接口。

这是有道理的,因为您使用参数new Object()调用您的方法。实际上,Object没有实现Serializable。但是,我想知道为什么writeObject的签名不仅仅是

writeObject(Serializable object)

可以防止出现这种错误。

答案 6 :(得分:0)

这是说您的对象不符合序列化过程的条件,因为它没有实现Serilizable接口。
根据java docs

  

java.io.NotSerializableException当一个实例需要具有Seri​​alizable接口时抛出。序列化运行时或实例的类可以抛出此异常。