Java中使用split()方法获取拆分部分遇异常,求代码排查
问题分析与解决方案
你的代码核心问题出在Scanner读取方式和字符串处理逻辑的搭配错误,导致了数组越界和单词拼接的问题:
问题原因
数组越界异常(IndexOutOfBoundException):
Scanner的next()方法是按空白字符(空格、换行等)分隔读取的,每次调用只会返回一个独立单词(比如示例文本里的"Pride"、"and")。你处理后的line是单个无空格的单词,调用split(" ")后得到的数组长度永远是1,根本不存在words[5]这个元素,自然会抛出越界异常。words[0]输出完整拼接文本:
这说明你大概率误将代码里的sc.next()写成了sc.nextLine()。如果用nextLine()读取整行文本,你的replaceAll("[^a-zA-Z]", "")会把所有非字母字符(包括空格)全部移除,整行文本变成无空格的长字符串,split(" ")自然只能得到一个元素,就是这个拼接后的长串。
修正后的代码方案
方案一:利用Scanner的next()直接读取单个单词(最简单)
既然next()已经帮你按单词分割了,直接处理单个单词后添加到集合即可,完全不需要拆分:
ArrayList<String> content = new ArrayList<>(); Scanner sc = new Scanner(new File("myfile.txt")); while (sc.hasNext()) { String word = sc.next().toLowerCase().replaceAll("[^a-zA-Z]", ""); if (!word.isEmpty()) { content.add(word); } } sc.close();
方案二:读取整行后正确分割单词
如果需要读取整行处理,先把非字母字符替换成空格,再按多空格拆分,避免出现空字符串:
ArrayList<String> content = new ArrayList<>(); Scanner sc = new Scanner(new File("myfile.txt")); while (sc.hasNextLine()) { String line = sc.nextLine().toLowerCase(); // 将非字母字符替换为空格,保证单词间的分隔 String cleanedLine = line.replaceAll("[^a-zA-Z]", " "); // 按一个或多个空格拆分,自动忽略连续空格导致的空元素 String[] words = cleanedLine.split("\\s+"); for (String word : words) { if (!word.isEmpty()) { content.add(word); } } } sc.close();
内容的提问来源于stack exchange,提问作者Vinh
相关产品推荐
相关产品推荐

