在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报错相关推荐

  1. AD20元件重叠绿色报错的解决方法,距离太近绿色报错

    有时因为元件靠的太近而导致绿色的报错. 但在实际中这样使用是没有问题的,可以人为的消除掉元件间距离检查. 距离太近报错的修改方法 设计 - 规则 - 将 ComponentClearance 中的 最 ...

  2. 终极方法, 解决Duplicate class 开头的报错内容全过程详解 - Duplicate class com.github.promeg.tinypinyin

    只要你是 Duplicate 开头的报错, 一定要看一下这个解决方法 只要你是 Duplicate 开头的报错, 一定要看一下这个解决方法 只要你是 Duplicate 开头的报错, 一定要看一下这个 ...

  3. SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错

    SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...

  4. 升级tomcat导致静态资源报错400

    先上结论:tomcat7.0-106之后的版本(包括8.5xx之后的版本,只是下了个较新的测试)改了DefualtServerlet类checkIfNoneMatch方法中的比较逻辑,导致用java中 ...

  5. Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...

    在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...

  6. 因 inode 不足导致数据库登陆报错相关问题

    墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,主要分享用数据泵导入数据时发生空间不足的问题 "No ...

  7. long类型转成integer类型避免空指针的方法_解决swagger的类型转换报错问题

    今天发现项目启动时,会打印一堆报错.吓了一跳. 查看之后发现是swagger的错误提示.并不影响功能.但是看着一堆错误,也闹心不是? 所以还是要解决一下. 2020-11-04 10:50:46,38 ...

  8. 查询LOB字段的连接不释放导致的TEMP报错

    国庆假期,某用户的两个数据库先后遇到临时表空间不足报错ORA-1652: unable to extend temp segment by 128 in tablespace  TEMP :此系统为典 ...

  9. MindSpore求导传入sens值时infer报错For ‘MatMul‘, the input dimensions

    1 报错描述 1.1 系统环境 Hardware Environment(Ascend/GPU/CPU): GPU Software Environment: MindSpore version (s ...

最新文章

  1. 阿里云云盾吴翰清:未来将重点构建阿里云用户安全的大生态
  2. jpa遇到mysql表名大写怎么办_解决(springboot项目)mysql表名大写,造成jpa Table doesn't exist问题...
  3. 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
  4. 使用PwDump导出本地Windows SAM散列并解密(解密windows账户密码)
  5. C语言实现 掷骰子游戏
  6. IsValid函数基本用法
  7. mysql 1698 错误
  8. SpringBoot Poi生成Excel文件时,下载的文件报错格式不正确需要修复
  9. 超火的微信小说小程序源码+比较轻量级/UI不错
  10. 【Flutter -- 基础组件】Flutter 导航栏
  11. Nginx设置开启/关闭/重启/开机自启
  12. 光纤收发器的6个指示灯说明
  13. 数码相框(三、LCD显示文字)
  14. uni-app框架调研
  15. 不同颜色的RGB值、透明度A
  16. 【2021考研】政治做题策略
  17. 造血干细胞最新研究进展
  18. MySQL数据库之压力测试
  19. 解决一个偶现的503 bug,花了俺不少时间
  20. 基于AT89C51单片机的液位检测及显示电路设计

热门文章

  1. Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
  2. hihocoder-1051,codeforces-884A(C语言+注释)
  3. Holy Grail【spfa签到题】
  4. Python实现简单的神经网络
  5. 2020软件测试自学全套教程-基于python自动化软件测试-2020新版软件测试中级程序员学习路线
  6. .reg文件添加、修改、删除注册表的方法
  7. 搭讪技巧,希望所有单身的程序员兄弟都有女朋友哦!!
  8. ArcGIS Server manger管理页面无法打开问题解决
  9. 服务器干货分享!做APP服务器怎么选择?
  10. Python学习记录-实战一、车牌归属地