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
相关产品推荐
相关产品推荐

