You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java触发StringIndexOutOfBoundsException导致用户输入读取异常排查

Java二维数组输入环节StringIndexOutOfBoundsException修复

异常产生的核心原因

问题根源出在Scanner类的方法行为差异上:

  • sc.nextInt()读取输入时,仅会提取到输入缓冲区中匹配整数规则的内容,不会消费掉整数末尾附带的换行符。这个残留的换行符会留在输入缓冲区里,成为后续第一次sc.nextLine()调用的返回内容。
  • 程序进入循环后第一次执行sc.nextLine(),实际拿到的是上一步整数输入行残留的空字符串,把这个空串传给fill()方法后,方法内部执行s1.charAt(0)时就会触发索引越界,抛出String index out of range: 0的异常。

这也能解释为什么硬编码第一行内容时程序运行完全正常——硬编码场景完全绕开了Scanner残留换行的读取链路,传入fill()的是长度合规的20位01字符串,不会触发越界。

修复方案

  • 方案1:在sc.nextInt()读取完成后,手动调用一次sc.nextLine()消费掉缓冲区残留的换行符,后续循环读取20行输入时就能拿到用户实际输入的01字符串。
  • 方案2:不再使用nextInt()读取旋转次数,改为读取整行内容后手动做类型转换,从根源上避免换行符残留问题,因为nextLine()本身会完整消费当前行的全部内容(包括行尾换行符)。
  • 额外健壮性优化:在fill()方法中增加入参长度校验,避免用户输入行长度不足20时再次触发越界异常。

参考修正代码片段

int input = sc.nextInt();
// 消费nextInt遗留的换行符
sc.nextLine();

for(int j = 0; j < 20; j++) {
    String rowStr = sc.nextLine().trim();
    fill(myAr, rowStr, j);
}

内容的提问来源于stack exchange,提问作者user101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 06:24:04