Java ArrayList命令行单词存储程序在Eclipse中运行异常求助
问题分析与解决建议
看起来你遇到的核心问题是混淆了Eclipse中「程序参数」和「标准输入」的区别,导致程序一直在等待输入,没有执行后续逻辑。咱们一步步来拆解:
1. 为什么程序没正常运行?
你的read()方法用Scanner(System.in)读取的是标准输入(控制台输入),但你在Eclipse的「运行配置」里输入的内容是程序启动参数(也就是main方法里的args数组),这俩完全不是一回事。所以程序启动后会卡在scanner.hasNext()这里,一直等你在控制台手动输入内容,自然不会执行后面的find和subsequence逻辑。
2. 两种解决思路
思路一:修改代码读取程序参数(更符合你当前的操作习惯)
如果想直接用Eclipse运行配置里输入的文本作为数据源,可以把read()方法改成读取main方法的args数组,这样输入的每个单词会被自动拆分到args里:
// 替换原来的read方法,或者新增一个方法接收args public void readFromArgs(String[] args) { for (String word : args) { // 处理掉句子里的标点(比如你输入的dog.),避免影响匹配 String cleanedWord = word.replaceAll("[^a-zA-Z]", ""); list.add(cleanedWord); } }
然后修改main方法:
public static void main(String[] args){ Search search = new Search(); // 改用新方法读取程序参数 search.readFromArgs(args); search.find("the"); for(String s : search.subsequence(new int[]{0, 3, 4})) System.out.println(s); }
思路二:保留原代码,在Eclipse中输入标准输入
如果你想继续用Scanner(System.in)读取输入,那在Eclipse里启动程序后,不要在运行配置里填参数,而是在控制台窗口手动输入你的测试文本,输入完后按Ctrl+Z(Windows)或Ctrl+D(Mac/Linux)来结束输入,这样程序就会继续执行后续逻辑了。
3. 其他小优化建议
- 你的
subsequence方法已经做了索引越界检查,这点很赞! - 如果想更清晰地展示
"the"的出现位置,可以优化find方法:
public void find(String word){ ArrayList<Integer> positions = new ArrayList<>(); for(int i = 0; i < list.size(); i++) { if(list.get(i).equalsIgnoreCase(word)) { positions.add(i); } } System.out.println("\"" + word + "\"出现的位置:" + positions); }
这样调整后,你的程序就能正常运行啦!
内容的提问来源于stack exchange,提问作者javanoob
相关产品推荐
相关产品推荐

