如何处理java.lang.ArrayIndexOutOfBoundsException: 1异常?
这种数组越界的问题真的很磨人,尤其是明明已经加了判断却还是踩坑!我来帮你捋捋可能的问题和解决办法。
首先,你提到错误出现在仅有一条注释的行,而且是分割字符串时索引到0却要访问1——这说明你的代码在处理这类行时,分割后的数组长度其实只有1,但你还是尝试访问索引1的元素。哪怕加了if判断,可能你的判断逻辑没覆盖到所有场景,或者分割方式本身就有问题。
我先梳理几个常见的坑:
1. 分割逻辑用错了分隔符
很多人会误以为注释和前面的内容是用空格分隔的,所以用split(" ")来拆分代码和注释,但如果单行注释是//注释内容(前面没有空格),或者行首有空格比如 //注释,这种分割方式就会出问题:
//注释内容用split(" ")分割后,数组只有1个元素(整个字符串),这时候访问parts[1]直接报错。- 就算你用
//作为分隔符,Java里的split方法参数是正则表达式,//需要转义成\\\\//(因为Java字符串里要表示一个\得写两个,正则里匹配/也要用\转义,所以最终是四个反斜杠加两个斜杠)。如果没转义,分割逻辑根本不生效,自然拿不到第二部分。
2. 判断单行注释的逻辑不全面
你可能只判断了line.startsWith("//"),但忽略了行首有空格的单行注释(比如 // 这是注释),这种情况下startsWith("//")返回false,你的代码可能会把它当成普通代码行处理,然后去分割访问parts[1],但如果分割后的数组长度不够,就会报错。
修复方案
给你一套更稳妥的处理逻辑:
第一步:用正确的方式分割代码和注释
用split("\\\\//", 2)来分割,第二个参数2表示最多分成两部分,避免把注释里的//也拆分(比如注释里写了// 这里有个//)。这样不管有没有代码部分,分割后的数组:
- 如果有注释,长度至少是2,
parts[0]是//前面的内容(可能是空或带空格),parts[1]是注释内容。 - 如果没有注释,长度是1,
parts[0]就是整行代码。
第二步:完善判断逻辑,先检查数组长度再访问元素
String line = ...; // 从文件读取的行 // 分割代码和注释,最多分2部分 String[] parts = line.split("\\\\//", 2); String codeContent = parts[0].trim(); String commentContent = ""; // 先判断是否有注释部分 if (parts.length >= 2) { commentContent = parts[1].trim(); } // 处理缩进逻辑 if (codeContent.isEmpty()) { // 这是单行注释(不管前面有没有空格) System.out.println(currentIndent + "// " + commentContent); } else { // 有代码的情况,处理代码缩进后加上注释 System.out.println(currentIndent + codeContent + " // " + commentContent); }
额外要测试的边界情况
- 空行:直接跳过或者保持原样
- 代码和注释在同一行:比如
int num = 0; // 初始化变量 - 注释里包含
//:比如// 注释里的//不会被拆分 - 行首有多个空格的单行注释:比如
// 带前置空格的注释
这样调整后,应该就能避免数组越界的问题了。
内容的提问来源于stack exchange,提问作者J.Rogers
相关产品推荐
相关产品推荐

