首页 > 基础资料 博客日记

Java InvalidObjectException异常详解(含代码分析)

2023-05-24 15:52:20基础资料围观457

    在Java中,InvalidObjectException是一个继承自ObjectStreamException的异常类。当对象流(Object Stream)试图从流中读取一个不符合序列化规则的对象实例时,就会抛出这个异常。

InvalidObjectException通常与实现了Serializable接口的类以及它们的readObject()方法有关。当readObject()方法在验证对象状态时发现不一致,或者无法恢复流中数据的有效状态时,可以抛出这个异常。


以下是一个简单的示例:


import java.io.*;
class MyClass implements Serializable {
    private static final long serialVersionUID = 1L;
    private int value;
    public MyClass(int value) {
        this.value = value;
    }
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject();
        // 检查反序列化后对象的值是否合法
        if (value < 0) {
            throw new InvalidObjectException("Invalid value: " + value);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        byte[] serializedData;
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            
            MyClass myObj = new MyClass(-10);
            oos.writeObject(myObj);
            serializedData = baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
             ObjectInputStream ois = new ObjectInputStream(bais)) {
            MyClass deserializedObj = (MyClass) ois.readObject();
            System.out.println(deserializedObj);
        } catch (InvalidObjectException e){
            System.out.print("捕获到InvalidObjectException异常:");
            System.out.println(e.getMessage());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}


在这个示例中,我们在MyClass的readObject()方法中检查反序列化的对象是否具有有效值。如果值无效(例如,小于0),则会抛出InvalidObjectException。在main函数中,我们捕获此异常,并打印异常消息。


标签:

相关文章

本站推荐

标签云