首页 > 基础资料 博客日记
Java InvalidObjectException异常详解(含代码分析)
2023-05-24 15:52:20基础资料围观835次
在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函数中,我们捕获此异常,并打印异常消息。
标签:

