当前位置: 首页 > 知识库问答 >
问题:

使用具有初始值的扫描仪的NoTouchElementException

常哲彦
2023-03-14

我正在做一个学校的项目。

我试图收集数据从一个. txt文件与扫描仪但我得到一个错误,当我想使用扫描仪启动变量。

File etudiant = new File("./data/etudiants.txt");
File personnel = new File("./data/personnel.txt");
Scanner scEtudiant = new Scanner(etudiant);
Scanner scPersonnel = new Scanner(personnel);

//creation liste etudiant
while (scEtudiant.hasNextLine()) {
    int num = scEtudiant.nextInt();
    String nom = scEtudiant.next();
    String prenom = scEtudiant.next();
    String telephone = scEtudiant.next();
    String email = scEtudiant.next();
    int annee = scEtudiant.nextInt();

    individuListe.put(num, new Etudiant(num, nom, prenom, telephone, email, annee));
}
scEtudiant.close();

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at gestion.Gala.<init>(Gala.java:37)
at gestion.Main.main(Main.java:7)

如果我删除变量并放置一些System.out.println(),它会正确显示数据,但仍会输出此错误。

共有3个答案

王才
2023-03-14

错误输出/堆栈跟踪显示调用扫描仪。nextInt()导致了NoTouchElementException。请参阅代码的第37行,其中调用了nextInt(),可能是以下两种情况之一:

  • int num=scEtudiant.nextInt();
  • int annee=scEtudiant.nextInt();

此异常由allnext.引发。。()类中的方法Scanner。它表示在扫描的文本流中未找到预期的下一个标记(此处为数字类型Int)。

请参阅nextInt()的JavaDoc以了解抛出说明:

投掷:

如果下一个标记不匹配整数正则表达式,或者超出范围

如果输入已耗尽

非法状态异常-如果此扫描仪已关闭

为了防止调用Next...()方法时出现此异常,您可以使用hasNext()hasNext...()hasNextLine()谓词方法测试下一个元素的存在。

另见:

  • Baeldung教程:Java扫描器hasNext()与hasNextLine()之比较

使用hasnetint()测试是否存在类型为int的下一个元素,依此类推。

while (scEtudiant.hasNextLine()) { // each student record on a new line
    if (!scEtudiant.hasNextInt()) { // guard breaks loop if no int
        break;
    }
    int num = scEtudiant.nextInt();

    if (!scEtudiant.hasNext()) { // guard breaks loop if no String
        break;
    }
    String nom = scEtudiant.next();
    
    if (!scEtudiant.hasNext()) { // guard breaks loop if no String
        break;
    }
    String prenom = scEtudiant.next();
    
    String telephone = ""; // not available, default to empty
    if (scEtudiant.hasNext()) { // optional: if string available 
       telephone = scEtudiant.next();
    }
    
    String email = ""; // not available, default to empty
    if (scEtudiant.hasNext()) { // optional: if string available 
       email = scEtudiant.next();
    }

    if (!scEtudiant.hasNextInt()) { // guard breaks loop if no int
        break;
    }
    int annee = scEtudiant.nextInt();

    var etudiant = new Etudiant(num, nom, prenom, telephone, email, annee)
    individuListe.put(etudiant.getNum(), etudiant);
}

谷梁博易
2023-03-14

循环条件更改为scEtudiant.hasNextInt()

通常在相应的nextXXX方法之前使用Scannerhastnextxxx方法。

葛念
2023-03-14

由于这个原因,您没有共享整个,我不能肯定地说,但可以猜测,您没有将默认值赋予基元变量,而循环。所以你应该做的是,首先在函数外面声明它们,给它们默认值,然后在循环的时候在里面使用它

 类似资料:
  • 问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和

  • 问题内容: 使用Scanner类中的useDelimiter时遇到一些问题。 如果我有这个输入 美国广播公司 输出将是 AB 然后等到我键入另一个“-”以打印出最后一个字符 但是,如果我没有用户输入数据,而是将字符串插入到Scanner中,则代码将起作用。原因是什么?如何解决?我不想使用StringTokenzier 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,

  • 我做了一个程序,要求3个整数来输出三角形的类型。所有内容都成功运行和编译,但是,在要求用户查看是否要再次循环的部分,联机编译器会输出错误: 异常线程"main"java.util.NoSuchElement异常在java.util.Scanner.throwFor(Scanner.java:838)在java.util.Scanner.next(Scanner.java:1347)在Assignm

  • 我是java新手,我的任务是使用扫描器读取数组,并在另一种方法中读取int。 我正在做的是计算一只兔子到达河对岸所需的最小跳跃次数。数组中的int表示从河的一边开始的石头的距离,另一个int表示石头的数量。兔子能跳的最远距离是50。 对于输入和输出: 输入n:7(输入,河中的石头数)32 46 70 85 96 123 145(输入,石头与起点之间的距离,最后一个数字是河的宽度,即目的地(河对岸)

  • 嗨,我正在编写一个程序,它使用Scanner从用户那里获取输入,然后使用布尔方法检查输入的长度是否不超过六个字符。问题是,如果长度小于六个,我使用了while循环来不断请求输入;但是在第一次错误输入后,如果你插入一串六个字母或更长的字符串,循环仍然会继续。这是程序: 谢谢

  • 位于java.util.scanner.throwfor(未知源)位于java.util.scanner.next(未知源)的线程“main”java.util.NoSuchelementException中出现异常**** 我多次调用s(扫描器),在第二次调用时出现运行时错误。这是由于关闭扫描仪,并可能再次使用它。我的问题是,每次使用Scanner时,我都会创建一个新的Scanner实例,那么为