当前位置: 首页 > java >正文

Java 异常处理之 BufferOverflowException(BufferOverflowException 概述、常见发生场景、避免策略)

一、BufferOverflowException 概述

  1. BufferOverflowException 是 Java NIO 包中的一个运行时异常,是 RuntimeException 的子类
public class BufferOverflowException extends RuntimeException {...
}
# 继承关系java.lang.Object-> java.lang.Throwable-> java.lang.Exception-> java.lang.RuntimeException-> java.nio.BufferOverflowException
  1. 它发生在尝试向缓冲区写入比可用空间更多的数据时,即缓冲区位置(position)已经到达或超过限制(limit)

二、常见发生场景

  1. 写入数据
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("初始化");
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());int i1 = 10;
byteBuffer.putInt(i1); // 添加 4 字节没问题
System.out.println("第 1 次添加数据:" + i1);
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());int i2 = 20;
byteBuffer.putInt(i2); // 再添加 4 字节没问题
System.out.println("第 2 次添加数据:" + i2);
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());int i3 = 30;
byteBuffer.putInt(i3);  // 再添加 4 字节,会抛出 BufferOverflowException 异常
System.out.println("第 3 次添加数据:" + i3);
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
# 输出结果初始化
pos=0, remaining=10, limit=10
第 1 次添加数据:10
pos=4, remaining=6, limit=10
第 2 次添加数据:20
pos=8, remaining=2, limit=10
Exception in thread "main" java.nio.BufferOverflowException
  1. 批量写入数据
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("初始化");
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());String data1 = "Hello1";
byteBuffer.put(data1.getBytes());
System.out.println("第 1 次添加数据:" + data1);
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());String data2 = "Hello2";
byteBuffer.put(data2.getBytes());
System.out.println("第 2 次添加数据:" + data2);
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
# 输出结果初始化
pos=0, remaining=10, limit=10
第 1 次添加数据:Hello1
pos=6, remaining=4, limit=10
Exception in thread "main" java.nio.BufferOverflowException

三、避免策略

1、基本介绍
  1. 总是调用 remaining 方法检查剩余空间是否足够,不同的写入方法对写入长度有不同的要求
方法读取长度(字节)
ByteBuffer put(byte b)1
ByteBuffer putChar(char value)2
ByteBuffer putShort(short value)2
ByteBuffer putInt(int value)4
ByteBuffer putLong(long value)8
ByteBuffer putFloat(float value)4
ByteBuffer putDouble(double value)8
ByteBuffer put(byte[] src)src.length
  1. 必要时,也可以通过 try catch 捕获异常
2、演示
  1. 写入数据(调用 remaining 方法检查)
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("初始化");
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());if (byteBuffer.remaining() >= 4) {int i1 = 10;byteBuffer.putInt(i1);System.out.println("第 1 次添加数据:" + i1);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
} else {System.out.println("第 1 次添加数据");System.out.println("剩余空间不足,无法添加数据");
}if (byteBuffer.remaining() >= 4) {int i2 = 20;byteBuffer.putInt(i2);System.out.println("第 2 次添加数据:" + i2);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
} else {System.out.println("第 2 次添加数据");System.out.println("剩余空间不足,无法添加数据");
}if (byteBuffer.remaining() >= 4) {int i3 = 30;byteBuffer.putInt(i3);System.out.println("第 3 次添加数据:" + i3);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
} else {System.out.println("第 3 次添加数据");System.out.println("剩余空间不足,无法添加数据");
}
# 输出结果初始化
pos=0, remaining=10, limit=10
第 1 次添加数据:10
pos=4, remaining=6, limit=10
第 2 次添加数据:20
pos=8, remaining=2, limit=10
第 3 次添加数据
剩余空间不足,无法添加数据
  1. 批量写入数据(调用 remaining 方法检查)
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("初始化");
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());String data1 = "Hello1";
if (byteBuffer.remaining() >= data1.length()) {byteBuffer.put(data1.getBytes());System.out.println("第 1 次添加数据:" + data1);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
} else {System.out.println("第 1 次添加数据");System.out.println("剩余空间不足,无法添加数据");
}String data2 = "Hello2";
if (byteBuffer.remaining() >= data2.length()) {byteBuffer.put(data2.getBytes());System.out.println("第 2 次添加数据:" + data2);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
} else {System.out.println("第 2 次添加数据");System.out.println("剩余空间不足,无法添加数据");
}
# 输出结果初始化
pos=0, remaining=10, limit=10
第 1 次添加数据:Hello1
pos=6, remaining=4, limit=10
第 2 次添加数据
剩余空间不足,无法添加数据
  1. 通过 try catch 捕获异常
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("初始化");
System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());try {String data = "abcdefghijklmnopqrstuvwxyz";byteBuffer.put(data.getBytes());System.out.println("添加数据:" + data);System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());} catch (BufferOverflowException e) {e.printStackTrace();System.out.println("添加数据失败");System.out.println("pos=" + byteBuffer.position() + ", remaining=" + byteBuffer.remaining() + ", limit=" + byteBuffer.limit());
}
# 输出结果初始化
pos=0, remaining=10, limit=10
java.nio.BufferOverflowException
添加数据失败
pos=0, remaining=10, limit=10
http://www.xdnf.cn/news/6465.html

相关文章:

  • 效法自然--让“存在”代替“价值”
  • DeepSearch:字节新一代 DeerFlow 框架
  • 9. 表的内连和外连
  • Linux | Linux系统安装虚拟机教程(超级简单)
  • Hashmap 和 map的区别
  • 入门消息队列
  • ProceedingJoinPoint的认识
  • 机器学习分类
  • AM1.5G太阳光模拟器参数
  • DeepSeek推理优化技巧:提升速度与降低成本
  • 代码随想录算法训练营第四十一天
  • 【Pandas】pandas DataFrame eval
  • STM32 DMA技术深度解析:从原理到实战应用讲解
  • 激光雷达视觉定位是3D视觉定位吗?
  • GCC 使用说明
  • 专项智能练习(定义判断)_DA_01
  • 案例:塔能精准能耗节能技术,驱动工厂智能变革
  • 异步日志系统01——日志系统框架
  • 扬州卓韵酒店用品:优质洗浴用品,提升酒店满意度与品牌形象
  • 应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
  • OpenCV CUDA模块中矩阵操作------范数(Norm)相关函数
  • 面试题:介绍一下JAVA中的反射机制
  • Springboot考研信息平台
  • 25.第二阶段x64游戏实战-分析物品相关数据
  • CSS 布局系统深度解析:从传统到现代的布局方案
  • 深入浅出:Windows系统DLL劫持提权原理
  • Java Socket编程完全指南:从基础到实战应用
  • SSTI 刷刷刷个题
  • 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
  • 电总协议调试助手更新-PowerBus-v1.0.5