【Java异常体系】(二)异常体系之IOException解析...

文章详细介绍了Java中的IOException及其常见的子类,如LoadException、EOFException和FileNotFoundException等,讨论了这些异常在文件处理、网络编程中可能出现的原因和处理方法,强调了使用try-catch语句进行异常处理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、IOException

IOException 同RuntimeException、SQLException一样,都是 Exception的一个子类。IOException表示发出某种I/O,即输入输出操作期间异常发生的信号,此异常是由失败或中断的I/O操作产生的一般异常

当Java程序尝试读取或写入文件、网络连接、数据库或其他外部资源时,可能会出现 IOException。这些异常可能是由于文件不存在、无法访问文件、网络连接中断、磁盘空间不足等原因引起的。

当IOException发生时,Java程序会抛出异常并停止执行,如果没有适当的异常处理程序,程序将崩溃。为了处理IOException,程序员通常使用try-catch语句块来捕捉并处理这些异常,以便在发生异常时采取适当的措施,如关闭文件或网络连接、输出错误消息等。

1、LoadException

LoadException(文件加载异常)这个异常类用于表示在加载Java类或资源时发生的异常。当Java程序尝试加载类或资源时,可能会出现此异常。这些异常可能是由于类文件或资源文件损坏、找不到类或资源文件、类或资源文件版本不兼容 等原因引起的。

LoadException通常与Java的类加载机制有关。在Java程序中,当需要使用某个类时,Java会尝试从文件系统或网络中加载该类,如果类文件损坏或找不到该类文件,则会引发LoadException。在某些情况下,LoadException可能会导致Java程序无法继续执行。

通常可使用try-catch语句块来捕捉并处理LoadException异常,以便在发生异常时采取适当的措施,如输出错误消息或重新加载类或资源文件。

异常例图

LoadException
异常分析
1、根据报错信息查看项目中是否存在指定的资源文件,若存在则查看文件是否能正常打开,文件数据是否正常;
2、若资源文件存在且能正常查看数据,则说明是项目的配置问题,导致加载不到此文件。

2、EOFException

EOFException(读取错误) 这个异常类用于表示在读取数据时已经到达了输入流的末尾。当尝试从输入流中读取数据时,如果输入流已经到达末尾,JVM会抛出EOFException异常。

EOFException通常发生在以下情况:

  • 试图从空文件中读取数据;
  • 试图从套接字(Socket)中读取数据,但对方已经关闭了连接;
  • 试图从输入流中读取数据,但已经读取到了文件的末尾。

异常例图
EOFException

3、FileNotFoundException

FileNotFoundException(文件找不到异常) 这个异常类表示在尝试打开、读取、写入文件时未找到相应的文件或目录。这个异常通常是由于文件不存在、文件名拼写错误或者访问权限不足等 原因引起的。

当具有指定路径名的文件不存在时,FileInputStream、FileOutputStream和RandomAccessFile构造函数将引发此异常。如果文件确实存在,但由于某些原因无法访问,例如试图打开只读文件进行写入时,这些构造函数也会抛出它。

异常例图

在这里插入图片描述
异常分析
FileNotFoundException异常处理方式一般包括打印错误信息、提示用户输入正确的文件名或路径、创建文件等。

4、InterruptedIOException

InterruptedIOException(线程中断或超时异常)是Java中的一个异常类,通常被用于处理网络连接、文件读写等I/O操作时的异常情况。它表示在进行I/O操作时,当前线程被中断或超时

当一个线程正在进行I/O操作时,如果另一个线程中断了当前线程,那么就会抛出这个异常。这个异常也用于在进行I/O操作时设置超时时间且在超时时间内没有完成I/O操作,也会抛出这个异常。

5、ObjectStreamException

ObjectStreamException(序列化或反序列化异常)是java.io包中的一个特定于对象流类的所有异常的超类,用于表示在对象序列化和反序列化期间发生的异常。当序列化或反序列化对象时,如果出现了异常情况,例如对象类型不匹配、流格式错误、版本不兼容等,就会抛出ObjectStreamException。

该异常有两个子类:InvalidClassException和NotSerializableException。

  • 当序列化或反序列化对象时,如果找不到类、类的版本不匹配或者类的序列化可能已经被禁止等情况时,会抛出InvalidClassException;
  • 如果对象没有实现Serializable接口,会抛出NotSerializableException。
    通常情况下,ObjectStreamException是由于对象序列化和反序列化期间出现了一些不可预期的问题,因此需要开发人员进行调试和修复。

6、UTFDataFormatException

UTFDataFormatException(非法UTF-8编码数据异常)异常类表示尝试将非法的UTF-8编码数据写入数据输出流或从数据输入流读取非法的UTF-8编码数据
在Java中,UTF-8编码是一种可变长度的编码方式,它使用1到4个字节来表示一个Unicode字符。

通常情况下,UTFDataFormatException的发生是由于以下原因引起的:

  • 尝试写入一个包含无效UTF-8编码的字符串;
  • 尝试读取一个包含无效UTF-8编码的字符串。
  • 尝试读取一个字节数组,但该字节数组的长度不足以表示一个有效的UTF-8编码。

如果出现UTFDataFormatException异常,通常需要检查数据的编码格式是否正确,并确保数据的长度足以表示一个有效的UTF-8编码。

7、UnknownServiceException

UnknownServiceException(未知协议或服务异常)异常类表示当试图在套接字上使用未知协议时,或者试图连接到未知服务时 抛出的异常。
当使用Java中的套接字进行网络编程时,可能会遇到UnknownServiceException异常。这通常是因为正在使用一个未知的协议或服务,或者试图连接到一个不存在的服务。

异常举例

Socket socket = new Socket("localhost", 99999);

异常分析
若 99999端口并不存在或者没有服务在该端口上运行,socket连接操作就会失败,并抛出UnknownServiceException异常。
也是因此,在Java中进行网络编程时,需要仔细检查和处理网络配置是否正确,以确保代码的正确性和稳定性。

8、ProtocolException

ProtocolException(错误协议异常)异常类用于表示在使用不正确的协议 时发生的异常。它通常是由于客户端和服务器之间协议不兼容或协议错误 而引起的。
ProtocolException通常与HTTP协议相关,例如当HTTP请求无法被服务器理解或处理时,服务器可能会抛出ProtocolException异常。此外,ProtocolException还可以在其他协议中发生,例如TCP,SMTP等等。
在Java中,ProtocolException类继承自IOException类,因此它是一个受检查的异常,必须在方法签名中声明或捕获并处理。当ProtocolException被抛出时,它会中断当前的操作并向上抛出,直到被捕获或程序终止。

9、UnknownHostException

UnknownHostException(无法解析主机异常)异常类表示在进行网络通信时无法解析主机名或IP地址。当程序试图使用一个不存在的主机名或IP地址时,就会抛出UnknownHostException异常。

在网络编程中,通常会使用主机名或IP地址来建立Socket连接或进行其他网络操作。如果使用的主机名或IP地址无法被解析,就会抛出UnknownHostException异常。这个异常通常是由DNS服务器无法解析主机名导致的,也可能是由于网络连接故障或主机名/IP地址输入错误引起的。

当出现UnknownHostException异常时,程序通常会中止运行或抛出其他异常。为了避免这种情况,可以在进行网络操作之前先对主机名或IP地址进行正确性检查,或者使用try-catch语句来捕获异常并进行处理。


🍭 一图总结

在这里插入图片描述


在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小山code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值