Java NIO 中怎么处理网络通信中的各种异常场景

夏墨小哥_1991

夏墨小哥_1991

2026-09-06

1027人浏览

原创

java nio异常需分类处理:closedchannelexception检查提前关闭,asynchronouscloseexception确保单线程管理channel,cancelledkeyexception轮询前校验isvalid(),ioexception触发重建;bytebuffer须正确flip/compact;连接失败退出流程,op_connect未完成需继续监听,read返回-1正常关闭、抛ioexception则重连;select须设超时并清理keys,空闲超时主动断连。

java nio 中怎么处理网络通信中的各种异常场景

分类捕获关键IO异常

Java NIO 的异常大多继承自 IOException,但不同子类代表完全不同的故障原因,必须分开处理:

  • ClosedChannelException:通道已被关闭,常见于多线程误用或提前释放资源。应检查是否在 write/read 前已调用 close(),或未加锁共享 channel
  • AsynchronousCloseException:另一线程调用了 channel.close(),当前操作被强制中断。需确保 channel 生命周期由单一责任方管理
  • CancelledKeyException:SelectionKey 已失效(如 channel 关闭后 key 未取消),应在每次轮询前用 key.isValid() 校验
  • IOException(无具体子类):底层连接重置、网络中断等通用错误,适合触发链路重建或心跳恢复逻辑

防止 ByteBuffer 状态错乱引发异常

多数 NIO 数据异常(如读不到数据、写入失败、空包)根源不在网络,而在 ByteBuffer 模式切换失误:

deep-java-review
deep-java-review

Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...

下载
  • 写入数据后必须调用 flip() 才能正确 write 到 channel;否则 position > limit,write 返回 0
  • 读取部分数据后若需继续写入(如半包场景),不能用 clear()(会丢弃未读字节),而要用 compact() 将剩余数据移到开头
  • 每次 read() 后检查返回值:-1 表示对端已关闭连接,0 表示本次无新数据(非错误),需结合业务逻辑判断是否继续等待

应对连接级与通信级异常的策略差异

NIO 中异常要按作用域分层响应:

  • 连接建立失败(如 connect() 抛异常):属于初始化问题,应记录错误并退出该连接流程,不进入 selector 轮询
  • OP_CONNECT 事件中 finishConnect() 返回 false:说明连接仍在进行中,需继续监听 OP_CONNECT,不可直接注册 OP_READ
  • OP_READ 时 read() 返回 -1:对端正常关闭,应 clean up key、关闭 channel、移除相关缓存
  • OP_READ 时 read() 抛 IOException:链路异常中断,需关闭 channel 并触发重连或告警

用 Selector 和超时机制规避阻塞与假死

NIO 不等于“不阻塞”,selector.select() 默认会无限等待,必须主动控制:

  • 始终使用 select(timeout)(如 1000ms),避免线程挂起导致整个 reactor 停摆
  • 在每次 select() 返回后,遍历 selectedKeys 时用 Iterator.remove() 及时清理,防止重复处理或 ConcurrentModificationException
  • 对长时间无响应的 channel,可配合 IdleStateHandler(Netty)或自定义空闲计时器,在读/写空闲超时后主动断开,防资源滞留

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9577

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6722

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5972

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1044

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

868

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1256

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2509

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19851

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1135

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习