重写Readable接口read()方法 传入Scanner导致的BufferOverflowException报错
在Main方法里产生随机单词, 导致异常BufferOverflowException
, 首先思考的是每次调用read()
方法应该会传入一个新的CharBuffer
吧(实际并不是, 后面说)
// Main.java
public static void main(String[] args) {Scanner scanner = new Scanner(new RandomWords(100000));while (scanner.hasNext()) {System.out.println(scanner.next());}
}// RandomWords.java
public class RandomWords implements Readable {private static Random random = new Random(100);private static final char[] CAPITALS ="ABCDEFGHIGKLMNOPQRSTUVWXYZ".toCharArray();private static final char[] LOWERS ="abcdefghigklmnopqrstuvwxyz".toCharArray();private int count;public RandomWords(int count) {this.count = count;}@Overridepublic int read(CharBuffer cb) throws IOException {if(count-- == 0) {return -1;}cb.append(CAPITALS[random.nextInt(CAPITALS.length)]);int maxCount = 4;for (int i = 0; i < maxCount; i++) {cb.append(LOWERS[random.nextInt(LOWERS.length)]);// System.out.println(cb.limit() + " - " + cb.position()); 下文指的注释代码cb.append(CAPITALS[random.nextInt(CAPITALS.length)]);}cb.append(" ");return 10;}
}
来到报错位置, 这一段是CharBuffer源码里的部分, 发现是由于position >= limit导致的异常, 然后查找得到这两个值得获取方法position()和limit();
final int nextPutIndex() { // package-privateif (position >= limit)throw new BufferOverflowException();return position++;
}
在RandomWords.java代码加入 System.out.println(cb.limit() + " - " + cb.position());
位置见上文注释代码
经过打印发现
AyAvFkNuM
1024 - 1002
1024 - 1004
1024 - 1006
1024 - 1008
RcEsZqFwO
1024 - 1012
1024 - 1014
1024 - 1016
1024 - 1018
HxEsXaStX
1024 - 1022
1024 - 1024
position属性并没有随着每次调用read() 方法重置, 所以每次调用read()方法传入的是同一个 CharBuffer
. 回到Scanner源码
//Scanner.java//通过查找找到调用read()方法的地方private void readInput() {if (buf.limit() == buf.capacity())makeSpace();// Prepare to receive dataint p = buf.position();buf.position(buf.limit());buf.limit(buf.capacity());int n = 0;try { // 这里调用了source.read() source就是构造方法传入的在RandomWords对象n = source.read(buf);} catch (IOException ioe) {lastException = ioe;n = -1;}if (n == -1) {sourceClosed = true;needInput = false;}if (n > 0)needInput = false;// Restore current position and limit for readingbuf.limit(buf.position());buf.position(p);}
发现其传入了buf
参数, 查找buf
来到
private Scanner(Readable source, Pattern pattern) {assert source != null : "source should not be null";assert pattern != null : "pattern should not be null";this.source = source;delimPattern = pattern;buf = CharBuffer.allocate(BUFFER_SIZE);buf.limit(0);matcher = delimPattern.matcher(buf);matcher.useTransparentBounds(true);matcher.useAnchoringBounds(false);useLocale(Locale.getDefault(Locale.Category.FORMAT));
}
发现是这个构造方法 对buf进行的赋值, 而 Scanner(Readable source)
这个构造方法也只是调用的上一个构造方法.
所以问题解决了, 由于我是在一开始就实例化了一个Scanner对象
. 导致传入read()
方法的buf
都是同一个 才导致的上文报错.
重写Readable接口read()方法 传入Scanner导致的BufferOverflowException报错相关推荐
- AD20元件重叠绿色报错的解决方法,距离太近绿色报错
有时因为元件靠的太近而导致绿色的报错. 但在实际中这样使用是没有问题的,可以人为的消除掉元件间距离检查. 距离太近报错的修改方法 设计 - 规则 - 将 ComponentClearance 中的 最 ...
- 终极方法, 解决Duplicate class 开头的报错内容全过程详解 - Duplicate class com.github.promeg.tinypinyin
只要你是 Duplicate 开头的报错, 一定要看一下这个解决方法 只要你是 Duplicate 开头的报错, 一定要看一下这个解决方法 只要你是 Duplicate 开头的报错, 一定要看一下这个 ...
- SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错
SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...
- 升级tomcat导致静态资源报错400
先上结论:tomcat7.0-106之后的版本(包括8.5xx之后的版本,只是下了个较新的测试)改了DefualtServerlet类checkIfNoneMatch方法中的比较逻辑,导致用java中 ...
- Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...
在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...
- 因 inode 不足导致数据库登陆报错相关问题
墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,主要分享用数据泵导入数据时发生空间不足的问题 "No ...
- long类型转成integer类型避免空指针的方法_解决swagger的类型转换报错问题
今天发现项目启动时,会打印一堆报错.吓了一跳. 查看之后发现是swagger的错误提示.并不影响功能.但是看着一堆错误,也闹心不是? 所以还是要解决一下. 2020-11-04 10:50:46,38 ...
- 查询LOB字段的连接不释放导致的TEMP报错
国庆假期,某用户的两个数据库先后遇到临时表空间不足报错ORA-1652: unable to extend temp segment by 128 in tablespace TEMP :此系统为典 ...
- MindSpore求导传入sens值时infer报错For ‘MatMul‘, the input dimensions
1 报错描述 1.1 系统环境 Hardware Environment(Ascend/GPU/CPU): GPU Software Environment: MindSpore version (s ...
最新文章
- 阿里云云盾吴翰清:未来将重点构建阿里云用户安全的大生态
- jpa遇到mysql表名大写怎么办_解决(springboot项目)mysql表名大写,造成jpa Table doesn't exist问题...
- 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
- 使用PwDump导出本地Windows SAM散列并解密(解密windows账户密码)
- C语言实现 掷骰子游戏
- IsValid函数基本用法
- mysql 1698 错误
- SpringBoot Poi生成Excel文件时,下载的文件报错格式不正确需要修复
- 超火的微信小说小程序源码+比较轻量级/UI不错
- 【Flutter -- 基础组件】Flutter 导航栏
- Nginx设置开启/关闭/重启/开机自启
- 光纤收发器的6个指示灯说明
- 数码相框(三、LCD显示文字)
- uni-app框架调研
- 不同颜色的RGB值、透明度A
- 【2021考研】政治做题策略
- 造血干细胞最新研究进展
- MySQL数据库之压力测试
- 解决一个偶现的503 bug,花了俺不少时间
- 基于AT89C51单片机的液位检测及显示电路设计
热门文章
- Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
- hihocoder-1051,codeforces-884A(C语言+注释)
- Holy Grail【spfa签到题】
- Python实现简单的神经网络
- 2020软件测试自学全套教程-基于python自动化软件测试-2020新版软件测试中级程序员学习路线
- .reg文件添加、修改、删除注册表的方法
- 搭讪技巧,希望所有单身的程序员兄弟都有女朋友哦!!
- ArcGIS Server manger管理页面无法打开问题解决
- 服务器干货分享!做APP服务器怎么选择?
- Python学习记录-实战一、车牌归属地