Day3-java基础

异常处理

1.常见异常
1、算术异常类:ArithmeticException
2、空指针异常类:NullpointerException
3、类型强制转换异常:ClassCastException
4、数组下标越界异常:ArrayIndexOutOfBoundsException
5、文件未找到异常:FileNotFoundException
6、操作数据库异常:SQLException
7、I/O 异常的根类:IOException
2.异常处理
处理异常有两种方式

1.在方法声明的位置上使用throws关键字抛出,谁调用就抛给谁
2.使用try…catch语句对异常进行捕捉。这个异常不会上报,自己把异常事件处理了。异常抛到此处位置为止,不在上抛了。

3.异常的分类

1.error
Error是非程序异常,即程序不能捕获的异常,一般是编译或者系统性的错误,如OutOfMemorry内存溢出异常等
2.exception
Exception是程序异常类,由程序内部产生。Exception又分为运行时异常,非运行时异常类。

文件操作、输入输出流等。

IO流根据流向分为 输入流和输出流
根据类型分为字节流与字符流,字节流用于处理二进制数据,以字节为单位进行读写操作;字符流用于处理文本数据,以字符为单位进行读写操作。
字节流:InputStream、OutputStream、FileInputStream、FileOutputStream等。
字符流:Reader、Writer、FileReader、FileWriter等。
还有缓冲流,他是基于字节流或字符流的装饰器,通过在内存中设置缓冲区来提高读写的效率。缓冲流可以减少对底层流的频繁读写操作,从而提高性能。常用的缓冲流类有:
字节缓冲流:BufferedInputStream、BufferedOutputStream。
字符缓冲流:BufferedReader、BufferedWriter。

2.序列化与反序列化
序列化(Serialization)是将对象转换为字节流的过程,以便将其存储在文件中、在网络上传输或在内存中持久化。反序列化(Deserialization)则是将字节流重新转换为对象的过程,以便恢复原始的对象。

实现对象的序列化和反序列化可以通过以下步骤:

  1. 让要序列化的类实现 java.io.Serializable 接口。这是一个标记接口,没有需要实现的方法,它只是标识该类可以被序列化。
public class MyClass implements Serializable {
    // 类的成员和方法
    // ...
}
  1. 创建一个输出流(如 FileOutputStreamByteArrayOutputStream),将其包装在对象输出流(ObjectOutputStream)中。对象输出流负责将对象转换为字节流并写入输出流。
MyClass obj = new MyClass();
FileOutputStream fileOut = new FileOutputStream("data.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);

out.writeObject(obj); // 将对象写入输出流
out.close(); // 关闭输出流
  1. 创建一个输入流(如 FileInputStreamByteArrayInputStream),将其包装在对象输入流(ObjectInputStream)中。对象输入流负责从输入流中读取字节流,并将其转换为对象。
FileInputStream fileIn = new FileInputStream("data.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);

MyClass obj = (MyClass) in.readObject(); // 从输入流中读取对象
in.close(); // 关闭输入流

被序列化的类和其中的字段必须是可序列化的。如果类中的某个字段不需要被序列化,可以使用 transient 关键字进行标记。

public class MyClass implements Serializable {
    private transient int transientField; // 不会被序列化的字段

    // ...
}

此外,还可以自定义序列化过程,实现 writeObject()readObject() 方法。这样可以在序列化和反序列化过程中自定义对象的写入和读取逻辑。

private void writeObject(ObjectOutputStream out) throws IOException {
    // 自定义序列化逻辑
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    // 自定义反序列化逻辑
}

通过实现序列化和反序列化,可以在Java中实现对象的持久化、远程通信和跨平台数据传输等功能。

3.在Java中,当一个对象被序列化后,会生成一个包含对象数据的字节流文件。如果对该序列化文件进行修改,可能导致反序列化失败或产生意外结果。

我了解的是原理是通过添加版本号(serialVersionUID)来实现。serialVersionUID 是一个用于标识序列化类的唯一标识符。当一个对象被反序列化时,Java会比较序列化类中的 serialVersionUID 和反序列化类中的 serialVersionUID 是否匹配。如果不匹配,Java会抛出 InvalidClassException,从而阻止反序列化。

如果在序列化文件被修改后,原始类的结构发生了变化(例如添加、删除或修改了字段、方法等),会导致序列化类的 serialVersionUID 发生变化,从而与反序列化类的 serialVersionUID 不匹配。这样,Java会抛出异常,阻止反序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值