Java程序问题:存单词到ArrayList后查找含'd'单词触发索引越界异常
解决ArrayList索引越界&查找含'd'单词的问题
嘿,我一眼就看出问题出在哪了——你遇到的java.lang.IndexOutOfBoundsException: Index: 170, Size: 170,本质是把ArrayList的索引范围搞混了。ArrayList的索引是从0开始计数的,当集合里有170个元素时,最大的有效索引是169(也就是size()-1)。如果你的循环条件写的是i <= wordList.size(),那当i=170的时候,去调用wordList.get(i)自然就会越界报错。
结合老师给的indexOf方法建议,咱们把代码修正过来,同时完成查找含'd'单词的需求:
方案1:修正普通for循环的边界
假设你已经完成了读取文件存入ArrayList<String> wordList的部分,那遍历查找的代码可以改成这样:
// 遍历ArrayList查找含'd'的单词 for (int i = 0; i < wordList.size(); i++) { // 关键:这里是i < size(),不是<= String word = wordList.get(i); // 用indexOf判断是否包含'd':返回值不等于-1就表示存在该字符 if (word.indexOf('d') != -1) { System.out.println(word); } }
方案2:用增强for循环(更简洁,彻底避免索引问题)
如果你不想再操心索引的事儿,推荐用Java的增强for循环,写法更直观,还不会踩索引的坑:
for (String word : wordList) { // 用indexOf("d")也可以,效果和indexOf('d')完全一致 if (word.indexOf("d") > -1) { System.out.println(word); } }
补充小技巧
String.indexOf(char c)方法会返回字符c在字符串中第一次出现的索引位置,找不到就返回-1,完美匹配老师给的判断逻辑。- 如果你需要区分大小写(比如只找小写'd',不匹配大写'D'),上面的写法刚好适用;如果要忽略大小写,可以先把单词转成统一大小写再判断:
word.toLowerCase().indexOf('d') != -1。
内容的提问来源于stack exchange,提问作者Rohan D
相关产品推荐
相关产品推荐

