为什么文本文件中的空行会导致java.util.NoSuchElementException?

为什么文本文件中的空行会导致java.util.NoSuchElementException?,java,readfile,Java,Readfile,如果您有一个文本文件: AAA:123:123:AAAA BBB:456:456:BBBB 首先,当文本文件中没有空行并且您读取和检索数据时。一切都很好 将文件写入新文件并替换数据或更新时 AAA:9993:9993:AAAA BBB:456:456:BBBB -------- This is a blank line----------- 发生这种情况后,将不会弹出任何TouchElementException。如果空白行未被移除,错误将始终弹出。 try { File fileCI =

如果您有一个文本文件:

AAA:123:123:AAAA
BBB:456:456:BBBB
首先,当文本文件中没有空行并且您读取和检索数据时。一切都很好

将文件写入新文件并替换数据或更新时

AAA:9993:9993:AAAA
BBB:456:456:BBBB
-------- This is a blank line-----------
发生这种情况后,将不会弹出任何TouchElementException。如果空白行未被移除,错误将始终弹出。

try {
File fileCI = new File("CI.txt");
FileWriter fileWriter = new FileWriter(fileCI);
BufferedWriter bw = new BufferedWriter(fileWriter); 

for (Customer ci : custList){
if (inputUser.equals(ci.getUserName()) && inputPass.equals(ci.getPassword())) {
    ci.setCardNo(newCardNo);
    ci.setCardType(newCardType);
}
    String text = ci.getRealName() + ";" + ci.getUserName() + ";" + ci.getPassword() + ";" + ci.getAddress() + ";" + ci.getContact() + ";" + ci.getcardType() + ";" + ci.getcardNo() + System.getProperty("line.separator");                                
    bw.write(text);
}
    bw.close();
    fileWriter.close();
}
catch (IOException e) {
    e.printStackTrace();
}
如果我不添加System.getProperty(“line.separator”);将添加字符串,所有内容都将合并到一行中,而不使用新的分隔符。但是这个分隔符在文本文件的末尾添加了一个空行。我能做些什么来避免这个问题吗

我应该在我读文件的地方解决吗?或者在我将文件写入新文件的地方解决它

    try {
        Scanner read = new Scanner(file);

        read.useDelimiter(";|\n");
        String tmp = "";
        while (read.hasNextLine()){
            if (read.hasNext()){
                custList.add(new Customer(read.next(), read.next(), read.next(), read.next(), read.next(), read.next(), read.next()));
            } else {
                break;
            }
        }
        read.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

编辑:这上面的阅读现在完美地工作了

我认为您到达了文件(EOF)的末尾,那里没有剩余的行,您仍在尝试读取该行。所以您得到的是NoTouchElementException(如果没有找到行)

试试这个:

String tmp="";
while (reader.hasNextLine()){  
   tmp = s.nextLine();
   // then do something

}
我认为您不必在分隔符中使用
\n
。因为我们使用的是
scanner.hasNextLine()
。如果要使用
scanner.next()
。然后

read.useDelimiter(";|\n");
上述行应为:

read.useDelimiter(";|\\n");// use escape character.
这样循环

while(s.hasNext()){ 
    //do something.
}

我认为你们到达了文件(EOF)的末尾,那个里并没有剩余的行,你们仍然在试图读取这行。所以您得到的是NoTouchElementException(如果没有找到行)

试试这个:

String tmp="";
while (reader.hasNextLine()){  
   tmp = s.nextLine();
   // then do something

}
我认为您不必在分隔符中使用
\n
。因为我们使用的是
scanner.hasNextLine()
。如果要使用
scanner.next()
。然后

read.useDelimiter(";|\n");
上述行应为:

read.useDelimiter(";|\\n");// use escape character.
这样循环

while(s.hasNext()){ 
    //do something.
}

那么,我如何让文件的读取者知道它的EOF,而不是试图检索更多的信息呢?@John看到了我上面的答案。看看我编辑的帖子。。我那样做对吗?我得到的是。。我只插入了中间部分,但没有插入第一和第三部分line@John为什么要将
temp
read.nextLine()
进行比较
temp
是空字符串,而
read.nextLine()
可能有一些字符串。如果nextLine是空的,我希望它停止,所以我认为比较tmp是正确的做法。如何让文件的读取知道其EOF,而不尝试检索更多信息?@John看到我上面的答案。查看我编辑的帖子。。我那样做对吗?我得到的是。。我只插入了中间部分,但没有插入第一和第三部分line@John为什么要将
temp
read.nextLine()
进行比较
temp
是空字符串,而
read.nextLine()
可能有一些字符串。如果nextLine是空的,我希望它停止,因此我认为比较tmp是正确的做法