如何修复Java代码中触发的String index out of bounds exception (charAt)异常?
修复StringIndexOutOfBoundsException异常的方案
这个问题我之前排查过好几次!咱们先拆解下异常原因:你看到的StringIndexOutOfBoundsException: String index out of range: 0,本质是你尝试访问一个空字符串的第0位字符——空字符串的长度是0,根本没有索引0的位置,自然就报错了。
为什么会出现这种情况?结合你的输入来看,大概率是reader.nextLine()读取到了空行(比如输入时不小心按了回车,或者输入内容里包含空白行),这时候example变量就变成了长度为0的空字符串,再调用charAt(0)就触发了异常。
修复代码的两种思路
思路1:先检查字符串是否为空,再操作
在调用charAt(0)之前,先判断字符串长度是否大于0,或者是否为空:
while (reader.hasNext()) { String example = reader.nextLine(); // 先处理空行:如果字符串为空,直接跳过本次循环 if (example.isEmpty()) { continue; } if (example.charAt(0) == '.') { break; } else { if (test(example)) { System.out.println("ok"); } else { System.out.println("no"); } } }
思路2:同时判断长度和首字符(更紧凑)
把长度判断和首字符判断合并到同一个条件里,避免额外的分支:
while (reader.hasNext()) { String example = reader.nextLine(); // 只有当字符串非空且首字符是'.'时才break if (example.length() > 0 && example.charAt(0) == '.') { break; } else if (!example.isEmpty()) { // 只对非空字符串执行test逻辑 if (test(example)) { System.out.println("ok"); } else { System.out.println("no"); } } // 空行直接跳过,不做任何处理 }
额外优化建议
如果输入中可能存在全是空格的行(比如用户输入了一堆空格后回车),可以先对字符串做trim()处理,把前后空白去掉后再判断是否为空:
String example = reader.nextLine().trim(); if (example.isEmpty()) { continue; }
这样就能避免把全空格的行当成有效行处理,也能防止这类行触发后续的索引异常。
内容的提问来源于stack exchange,提问作者Nguyen
相关产品推荐
相关产品推荐

