Java类内实现文本分割为150份时遇NoSuchElementException错误求助
解决NoSuchElementException异常与文本分割逻辑问题
首先咱们先搞定那个异常,再梳理你代码里的逻辑问题——毕竟你要把文本分成150份的核心需求现在完全没实现,还出了报错。
一、异常根源排查
你贴的异常是java.util.NoSuchElementException: No line found,来自Scanner.nextLine(),但你给出的setperek方法里用的是BufferedReader的readLine()。这里有两种大概率的情况:
- 你实际写代码的时候误用了
Scanner而非BufferedReader,而且没在调用nextLine()前检查是否还有剩余行; - 异常来自主类的代码,主类里用了
Scanner操作,触发了这个报错。
顺带说一句,你当前BufferedReader的写法while ((nextLine = inputReader.readLine()) != null)是没问题的,不会因为读不到行抛出异常,所以重点排查是不是混用了Scanner。
二、你的代码逻辑有哪些核心问题
现在的代码完全达不到“把文本分割成150份”的目的,问题挺明显的:
- 循环逻辑彻底错了:每次读一行,就循环1到150把当前行的内容赋值给所有
pirkoni[i],最后所有150个对象都会被最后一行的内容覆盖,等于白做; - 分割符用错了:
nextLine.split("$")里的$是正则的特殊字符(表示行尾),如果你的文本真的用$当分隔符,必须转义成"\\$",否则分割结果就是包含整行的数组; - 无意义的代码:
for(int i=1; i<=150; i++) pirkoni.toString();这行调用的是数组的toString(),根本不会输出每个TehilimEpisode的内容,要改成System.out.println(pirkoni[i].toString());才能看到结果; - 数组索引踩坑:Java数组索引从0开始,你从i=1到150赋值,不仅会让
pirkoni[0]空着,还可能因为数组长度是150抛出ArrayIndexOutOfBoundsException(索引150超出了数组的最大索引149)。
三、修正后的代码实现
假设你的需求是文本文件里有150行,每行对应一个章节的内容,这是最常见的场景,我给你改好了代码:
修正后的setperek方法
public static void setperek(TehilimEpisode[] pirkoni) throws IOException { // 注意:文件路径要写具体文件名,别用*通配符,比如改成"C:\\tehilim.txt" BufferedReader inputReader = new BufferedReader(new FileReader("C:\\your_file_name.txt")); String nextLine; int index = 0; // 数组从0开始索引,符合Java规范 // 读一行存一个对象,直到文件读完或者填满150个 while ((nextLine = inputReader.readLine()) != null && index < 150) { // 转义$分隔符,保证分割正确 String[] ab = nextLine.split("\\$"); // EpisodeID从1开始,符合你原来的需求 pirkoni[index] = new TehilimEpisode(index + 1, ab); index++; } inputReader.close(); // 一定要关流,避免资源泄漏 // 输出所有对象内容,方便验证 for(int i=0; i<index; i++) { System.out.println(pirkoni[i].toString()); } }
主类调用时的正确姿势
初始化数组的时候要指定长度为150:
public static void main(String[] args) throws IOException { TehilimEpisode[] pirkoni = new TehilimEpisode[150]; TehilimEpisode.setperek(pirkoni); }
如果你的需求是把整个文本内容平均分成150段(不是按行分),那可以用下面这个版本:
public static void setperek(TehilimEpisode[] pirkoni) throws IOException { BufferedReader inputReader = new BufferedReader(new FileReader("C:\\your_file_name.txt")); StringBuilder fullContent = new StringBuilder(); String nextLine; // 先把整个文件内容读进来 while ((nextLine = inputReader.readLine()) != null) { fullContent.append(nextLine).append("\n"); } inputReader.close(); String content = fullContent.toString(); int totalLength = content.length(); int segmentLength = totalLength / 150; for(int i=0; i<150; i++) { int start = i * segmentLength; // 最后一段要处理剩余的所有内容,避免丢数据 int end = (i == 149) ? totalLength : start + segmentLength; String segment = content.substring(start, end); // 这里可以按你的需求分割成数组,比如按空格分割 String[] ab = segment.split(" "); pirkoni[i] = new TehilimEpisode(i+1, ab); } // 验证输出 for(TehilimEpisode episode : pirkoni) { System.out.println(episode.toString()); } }
四、异常的最终解决
如果异常确实来自Scanner的使用,那一定要在调用nextLine()前先判断是否还有行可读:
Scanner scanner = new Scanner(new File("C:\\your_file_name.txt")); while(scanner.hasNextLine()) { String line = scanner.nextLine(); // 你的处理逻辑 } scanner.close();
内容的提问来源于stack exchange,提问作者Aviatar S.
相关产品推荐
相关产品推荐

