首页 > 基础资料 博客日记
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函数中,我们捕获此异常,并打印异常消息。
标签: