Java TMSimulator程序抛出NoSuchElementException错误及数据处理咨询
解决TMSimulator中的NoSuchElementException及多组状态数据处理问题
一、修复input.nextLine()的NoSuchElementException错误
这个错误的核心原因是Scanner尝试读取不存在的输入行,常见场景和修复方法:
- 不要混用/提前关闭Scanner实例:如果代码同时用Scanner读取文件和控制台输入,必须为两者创建独立的Scanner对象,绝对不能在读取完文件后调用
close()——这会关闭整个系统输入流,导致后续控制台输入的Scanner无法读取内容。 - 读取前先判断是否有输入:在调用
nextLine()前,先用hasNextLine()做检查,避免直接读取空输入流:Scanner consoleInput = new Scanner(System.in); String inputStr; if (consoleInput.hasNextLine()) { inputStr = consoleInput.nextLine(); // 处理输入字符串(比如示例中的"11") } else { System.err.println("未获取到有效控制台输入"); // 这里可以加默认值处理或终止逻辑 } // 程序结束前再关闭控制台Scanner consoleInput.close(); - 检查IDE运行配置:如果在IDE中运行,确保运行配置开启了控制台输入支持,部分情况下IDE会默认关闭输入流导致读取失败。
二、TM.txt多组状态数据处理方案
针对文件中的多组状态信息,以下是两种可落地的处理思路,可根据实际文件格式选择:
思路1:按分隔符拆分状态组
如果TM.txt用固定分隔符(比如空行、---标记)分隔不同状态组,逐行读取时通过分隔符拆分各组:
假设TM.txt格式示例:
q0,a->q1,b,R
q1,b->q0,a,Lq0,1->q1,1,R
q1,1->q2,_,L
对应的处理代码:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class TMSimulator { public static void main(String[] args) { List<List<String>> tmStateGroups = new ArrayList<>(); List<String> currentGroup = new ArrayList<>(); try (Scanner fileScanner = new Scanner(new File("TM.txt"))) { while (fileScanner.hasNextLine()) { String line = fileScanner.nextLine().trim(); // 遇到分隔符时,将当前组存入列表并重置 if (line.isEmpty() || line.equals("---")) { if (!currentGroup.isEmpty()) { tmStateGroups.add(new ArrayList<>(currentGroup)); currentGroup.clear(); } } else { currentGroup.add(line); } } // 处理文件末尾的最后一组(如果没有以分隔符结尾) if (!currentGroup.isEmpty()) { tmStateGroups.add(currentGroup); } } catch (FileNotFoundException e) { e.printStackTrace(); } // 遍历处理每组状态 for (int i = 0; i < tmStateGroups.size(); i++) { System.out.println("处理第" + (i+1) + "组状态:"); for (String state : tmStateGroups.get(i)) { System.out.println(state); } } } }
思路2:按固定结构读取状态组
如果每组状态的行数固定,或者文件中明确标记了每组的行数,可以先读取行数再读取对应内容:
假设TM.txt格式示例:
2
q0,a->q1,b,R
q1,b->q0,a,L
2
q0,1->q1,1,R
q1,1->q2,_,L
对应的处理代码:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class TMSimulator { public static void main(String[] args) { List<List<String>> tmStateGroups = new ArrayList<>(); try (Scanner fileScanner = new Scanner(new File("TM.txt"))) { while (fileScanner.hasNextInt()) { // 读取当前组的状态行数 int groupSize = fileScanner.nextInt(); fileScanner.nextLine(); // 跳过行数后的换行符 List<String> currentGroup = new ArrayList<>(); // 读取对应行数的状态内容 for (int i = 0; i < groupSize; i++) { if (fileScanner.hasNextLine()) { currentGroup.add(fileScanner.nextLine().trim()); } } tmStateGroups.add(currentGroup); } } catch (FileNotFoundException e) { e.printStackTrace(); } // 遍历处理每组状态 for (int i = 0; i < tmStateGroups.size(); i++) { System.out.println("处理第" + (i+1) + "组状态:"); for (String state : tmStateGroups.get(i)) { System.out.println(state); } } } }
内容的提问来源于stack exchange,提问作者Chris Ndirangu
相关产品推荐
相关产品推荐

