在java中读取文件时出错

时间:2016-07-24 18:46:28

标签: java readfile nosuchelementexception

我一直在尝试练习I / O文件编程,而且我仍处于基础阶段。使用java写入文件很简单,但读取文件开始让我头疼。这是我试图运行的一个简单程序(顺便说一句,我是根据Liang的一本书编写的程序)。

import java.util.Scanner;
import java.io.File;
public class Reading {
private static Scanner n;

public static void main(String[] args) throws Exception
{
    File files = new File("samples.txt");
    n = new Scanner(files);

    while(n.hasNext())
    {
        String firstName = n.next();
        String mi = n.next();
        String lastName = n.next();
        int score = n.nextInt();
        System.out.println(
        firstName + " " + mi + " " + lastName + " " + score);
    }

    n.close();
}

}

这是错误:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at OOPFinals.Reading.main(Reading.java:17)

如何使此计划有效? 救命啊!

5 个答案:

答案 0 :(得分:2)

None(Object)抛出NoSuchElementException,表示文件中没有其他令牌。

这里的问题是你的Scanner.next()循环只保证至少有一个令牌可以从文件中读取,但是在循环的每次迭代中你都在读取五个令牌。

答案 1 :(得分:2)

您的代码中发生了什么,您正试图从扫描仪中读取,尽管没有什么可以阅读。 你应该做什么 - 你需要在每次调用n.next()或n.nextInt()之前检查n.hasNext(),或者只读整行(这看起来正是你想要的):

while (n.hasNextLine()) {
       String line = n.nextLine();
       System.out.println(line);
}

答案 2 :(得分:0)

有时,当您阅读文件时,您会遇到各种角色。有些是字母,有些是数字,有些是整数。您需要检查它是字母,数字还是整数,因为以下行假定您传递的是整数:

    int score = n.nextInt();

可以通过检查整数

来解决
    int score = 0;
    if(n.hasNextInt()) { score = n.nextInt(); }

当您从该计划中阅读时,请务必考虑到Cathial的答案。使用hasNext(),您只需检查是否有一个字符串,也称为令牌。您应该检查是否有n个字符串可用,其中n是循环中.next()个函数的数量。

答案 3 :(得分:0)

您的代码正在运行,因为提供了正确的输入文件“ samples.txt ”。例如,给出以下输入:

Richard Feynman 100
Paul Adrien Dirac 90

一切正常,但是如果您使用以下内容:

import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.File;
public class Reading {
private static Scanner n;

public static void main(String[] args) throws Exception
{
    File files = new File("samples.txt");
    n = new Scanner(files);
    String data;
    while(n.hasNextLine() && !(data = n.nextLine()).equals(""))
    {
        StringTokenizer st = new StringTokenizer(data);

        if(st.countTokens() >= 4) {
            String firstName = (String) st.nextElement();        
            String mi = (String) st.nextElement();
            String lastName = (String) st.nextElement();
            int score = Integer.parseInt( (String) st.nextElement());
            System.out.println(
            firstName + " " + mi + " " + lastName + " " + score);

        } else {
            System.err.println("This line is malformed!");
        }
    }

    n.close();
}

}

然后你获得 NoSuchElementException 。在上一个示例中,我删除了程序所期望的中间名。因此,我们可以得出结论,您希望在文件中读取信息,而无需读取任何信息。我推荐如下内容:

$form->handleRequest($request);

$wasSubmitted = $form->isSubmitted();

if(!$wasSubmitted){
    $form->submit($form->getData(),false);
}

if ($form->isValid()) {
    // ...

    // next lines are to be sure that the form will always need to be submitted manualy :
    if($wasSubmitted){
        $em->persist($entity);
        $em->flush();

        return $this->render ...
    }
}

return $this->render ...

在此程序中,您可以拥有一个空行的示例文件,并且它希望每行读取4个令牌,否则会打印一条错误消息,通知您行输入格式错误。

答案 4 :(得分:-3)

确保您的文件位于正确的文件夹中。如果samples.txt与主类不在同一个文件夹中,则需要指定路径。