【问题标题】:Scanner isn't separating text file into tokens扫描仪没有将文本文件分成令牌
【发布时间】:2017-04-30 04:16:36
【问题描述】:

任何帮助将不胜感激。我正在尝试让扫描仪读取文本文件,然后将其输入到数组列表中。这是我的演示程序:

import java.util.*;
import java.io.*;

public class EmployeeDemo
{
   public static void main(String[] args) throws IOException
   {
      ArrayList<Employee> employees = new ArrayList<>();

      File emps = new File("Employees.txt");
      Scanner inputFile = new Scanner(emps); 

     for(int i = 0; i < 6; i++)
     {
         String id = inputFile.next();
         String name = inputFile.next();
         String department = inputFile.next();
         String position = inputFile.next();
         String salary = inputFile.next();
         String yrsofser = inputFile.next(); 

         employees.add(new Employee(id, name, department, position, salary, yrsofser));
      }

      inputFile.close();
      System.out.println(employees);
   }
}

对于文本文件,我现在只使用它:

101000
John Smith
EMS
EMT
21778.00
5

这是我得到的错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at EmployeeDemo.main(EmployeeDemo.java:16)

我尝试在 id 之后打印它,它给了我 id 号,然后它打印服务年限。 我还在 id 之后尝试了 inputFile.hasNext() 并得到了错误。

有人知道为什么会发生这种情况吗?

【问题讨论】:

  • 您需要调用nextLine() 来使用行终止符。
  • 也许只是你的例子:它包含 6 个值;但是由于周围的 for 循环,您的代码想要读取 6 x 6 的值。
  • 实际上,该文件包含 7 个值(令牌),因为第 2 行是两个令牌:JohnSmith。这意味着值被读取为id = "101000"; name = "John"; department = "Smith"; position = "EMS"; salary = "EMT"; yrsofser = "21778.00";,而"5" 被读取为第二个Employeeid
  • @EJP 谢谢!但是现在我添加了 nextLine() 我收到了这个错误:'线程“main”中的异常 java.util.NoSuchElementException:在 EmployeeDemo 的 java.util.Scanner.nextLine(Scanner.java:1540) 处找不到行。 main(EmployeeDemo.java:15)'
  • 糟糕!就是这样!我从文本文件中取出员工以找出问题所在,却忘记修复 for 循环。非常感谢! @鬼猫

标签: java arraylist text io


【解决方案1】:

根据您的代码,字符串标记化发生在每个空格之后。因此,它会认为您的文件中有 7 个标记(而不是 6 个),因为“John”和“Smith”被视为两个单独的标记。因此,最后一个标记再次被视为第二个员工的“id”的下一个值,其余变量将没有任何值。因此,它会抛出“NoSuchElementException”,因为文本文件中没有要添加的值。

【讨论】:

    【解决方案2】:

    第一个也是最重要的问题:您的输入文件似乎只包含 6 行,也就是 7 行。

    但是由于您的 for 循环,您的代码需要 6 x 6 行!

    除此之外:例如,当您知道某行包含整数时,您可以使用 nextInt() 而不是读取扁平字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多