我收到了NoSuchElementException

时间:2019-11-23 22:13:12

标签: java arrays

public static void main(String[] args) throws FileNotFoundException 
    {
        Scanner inputFile = new Scanner("Employees.txt");
        inputFile.useDelimiter(",");
        String[] strLastName = new String[10];
        String[] strFirstName = new String[10];
        double[] dHours = new double[10];
        double[] dPayRate = new double[10];
        int x = 0;

        while(inputFile.hasNext())
        {
            strLastName[x] = inputFile.next();
            strFirstName[x] = inputFile.next();
            dHours[x] = Double.parseDouble(inputFile.next());
            dPayRate[x] = Double.parseDouble(inputFile.next());
            x++;
        }
        inputFile.close();
        String[] strFullName = FullName(strFirstName, strLastName);
        double[] dGrossPay = GrossPay(dHours, dPayRate);
        Output(strFullName, dHours, dPayRate, dGrossPay);
    }

此代码在strLastName[x] = inputFile.next();处停止,我不确定为什么。它以找到的java.util.NoSuchElementException出现。

2 个答案:

答案 0 :(得分:1)

您的问题是,您每次检查next()时,都会四次致电hasNext()。如果您的输入像这样在同一行:

First Last hours rate

然后,您应将inputFile.hasNext()替换为inputFile.hasNextLine()

如果它们都位于不同的行上,例如:

First
Last
hours
rate

然后,您需要在所有inputFile.next()之前(第一个之后)放置if语句。像这样:

while(inputFile.hasNext())
    {
        strLastName[x] = inputFile.next();
        if (inputFile.hasNext()) {
          strFirstName[x] = inputFile.next();
        }
        if (inputFile.hasNext()) {
          dHours[x] = Double.parseDouble(inputFile.next());
        }
        if (inputFile.hasNext()) {
          dPayRate[x] = Double.parseDouble(inputFile.next());
        }
        x++;
    }

编辑:同样,下面的注释器是正确的,您正在以字符串而不是文件的形式调用扫描程序。您需要在开始时添加以下内容:

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

答案 1 :(得分:0)

您指定了useDelimiter(","),但这真的是所有值的分隔符吗?

我的猜测不是,因为Employees.txt可能是CSV(逗号分隔值)文件,例如像这样:

Doe,John,40,15.00
Smith,Jane,35,12.00

以逗号分隔时,将获得以下值:

Doe
John
40
15.00\nSmith
Jane
35
12.00

如您所见,行尾并没有导致15.00Smith是两个令牌。

解决方案:

  1. 使用CSV解析器 (强烈建议)

  2. 指定正确的定界符(不建议,也容易出错)

    inputFile.useDelimiter(",|\\R");
    
  3. 使用行读取并拆分行:

    String[] strLastName = new String[10];
    String[] strFirstName = new String[10];
    double[] dHours = new double[10];
    double[] dPayRate = new double[10];
    try (BufferedReader inputFile = Files.newBufferedReader(Paths.get("Employees.txt"))) {
        String line;
        for (int x = 0; (line = inputFile.readLine()) != null; x++) {
            String[] values = line.split(",");
            if (values.length != 4)
                throw new IOException("Bad data: " + line);
            strLastName[x] = values[0];
            strFirstName[x] = values[1];
            dHours[x] = Double.parseDouble(values[2]);
            dPayRate[x] = Double.parseDouble(values[3]);
        }
    }