博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“java基础课程”,即可免费获得全套架构师全套课程
一、java.io
1.52 ObjectStreamException
ObjectStreamException
是所有对象流异常的父类。它是一个受检查的异常,用于表示在对象流操作期间可能发生的异常情况。这个类通常不直接实例化,而是由其子类来表示特定的异常情况。
ObjectStreamException 类介绍:
所有字段:
-
没有公共字段。
构造方法:
-
ObjectStreamException()
:构造一个新的 ObjectStreamException 实例,其中 detail message 为 null。
方法摘要:
-
没有公共方法。
简单使用例子:
由于 ObjectStreamException
是一个异常类,因此通常不会直接使用它,而是使用其子类来表示特定的异常情况。以下是一个简单的示例,演示了如何捕获 ObjectStreamException
异常:
javaCopy code import java.io.*; public class ObjectStreamExceptionExample { public static void main(String[] args) { try { // 尝试执行可能抛出 ObjectStreamException 的操作 serializeObject(null, "nonexistentfile.ser"); } catch (ObjectStreamException e) { // 捕获 ObjectStreamException 并处理 System.err.println("An ObjectStreamException occurred: " + e.getMessage()); } } private static void serializeObject(Object obj, String filename) throws ObjectStreamException { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filename))) { outputStream.writeObject(obj); System.out.println("Object serialized successfully."); } catch (IOException e) { // 如果发生 I/O 异常,则封装为 ObjectStreamException 并抛出 throw new ObjectStreamException("Error occurred while serializing object: " + e.getMessage()); } } }
在这个示例中,serializeObject
方法尝试将对象写入文件。如果写入过程中发生了 I/O 异常,它将捕获并将异常转换为 ObjectStreamException
,然后重新抛出。在 main
方法中,我们尝试调用 serializeObject
方法,并捕获可能抛出的 ObjectStreamException
。
应用场景
ObjectStreamException
通常在对象序列化和反序列化的过程中出现,其子类可以表示不同的异常情况。以下是一些可能的应用场景及相应的代码实现:
应用场景 1: 序列化对象时文件不存在
javaCopy code import java.io.*; public class SerializationExample { public static void main(String[] args) { try { // 尝试将对象序列化到不存在的文件 serializeObject(null, "nonexistentfile.ser"); } catch (ObjectStreamException e) { // 捕获 ObjectStreamException 并处理 System.err.println("An ObjectStreamException occurred: " + e.getMessage()); } } private static void serializeObject(Object obj, String filename) throws ObjectStreamException { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filename))) { outputStream.writeObject(obj); System.out.println("Object serialized successfully."); } catch (IOException e) { // 如果发生 I/O 异常,则封装为 ObjectStreamException 并抛出 throw new ObjectStreamException("Error occurred while serializing object: " + e.getMessage()); } } }
在这个示例中,尝试将对象序列化到一个不存在的文件中。当文件不存在时,会抛出 IOException
,serializeObject
方法将捕获并将其封装为 ObjectStreamException
并抛出。
应用场景 2: 反序列化对象时文件损坏
javaCopy code import java.io.*; public class DeserializationExample { public static void main(String[] args) { try { // 尝试从损坏的文件中反序列化对象 deserializeObject("corruptedfile.ser"); } catch (ObjectStreamException e) { // 捕获 ObjectStreamException 并处理 System.err.println("An ObjectStreamException occurred: " + e.getMessage()); } } private static Object deserializeObject(String filename) throws ObjectStreamException { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filename))) { Object obj = inputStream.readObject(); System.out.println("Object deserialized successfully."); return obj; } catch (IOException | ClassNotFoundException e) { // 如果文件损坏或对象类不匹配,则封装为 ObjectStreamException 并抛出 throw new ObjectStreamException("Error occurred while deserializing object: " + e.getMessage()); } } }
在这个示例中,尝试从一个损坏的文件中反序列化对象。当文件损坏或对象类不匹配时,会抛出 IOException
或 ClassNotFoundException
,deserializeObject
方法将捕获并将其封装为 ObjectStreamException
并抛出。
实战例子
在一个实际项目中,ObjectStreamException
可能会在对象序列化和反序列化的过程中出现。以下是一个简单的实战例子,演示如何在 Java 中使用对象序列化和反序列化来保存和加载对象数据。
假设你正在开发一个简单的学生管理系统,你想要保存学生对象到文件中以便将来使用,同时还能够从文件中加载学生对象。你可以使用对象序列化和反序列化来实现这一功能。
首先,我们定义一个 Student
类表示学生对象:
javaCopy code import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; public Student(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
接下来,我们编写一个类来保存和加载学生对象:
javaCopy code import java.io.*; public class StudentManager { public static void saveStudent(Student student, String filename) { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filename))) { outputStream.writeObject(student); System.out.println("Student saved successfully."); } catch (IOException e) { System.err.println("Error occurred while saving student: " + e.getMessage()); } } public static Student loadStudent(String filename) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filename))) { Student student = (Student) inputStream.readObject(); System.out.println("Student loaded successfully."); return student; } catch (IOException | ClassNotFoundException e) { System.err.println("Error occurred while loading student: " + e.getMessage()); return null; } } public static void main(String[] args) { // 保存学生对象到文件 Student student1 = new Student(1, "Alice"); saveStudent(student1, "student.ser"); // 从文件中加载学生对象 Student loadedStudent = loadStudent("student.ser"); if (loadedStudent != null) { System.out.println("Loaded student: " + loadedStudent); } } }
在这个例子中,我们首先创建了一个 Student
类来表示学生对象。然后,我们编写了一个 StudentManager
类来保存和加载学生对象。saveStudent
方法将学生对象保存到文件中,而 loadStudent
方法则从文件中加载学生对象。在 main
方法中,我们演示了如何使用这些方法来保存和加载学生对象。
这个示例展示了如何在实际项目中使用对象序列化和反序列化来保存和加载对象数据。