java - 尝试从文本文件读取 double 值,但引发了 InputMismatchException

标签 java io java.util.scanner inputmismatchexception

我正在尝试制作一个处理“大”文本文件的程序。该文本文件显示 1000 行,每行对应一名教职员工。每行包含名字、姓氏、军衔和薪水。

文本文件链接: http://cs.armstrong.edu/liang/data/Salary.txt

程序应按级别统计员工数量,以及每组的总工资。最后,应显示每个组的总工资以及给定级别的员工的平均工资。我还没有完成整个程序,目前我正在确保文本文件被正确读取。

代码示例如下:

package ch12;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

public class Chapter_12_E25_ProcessLargeDataSet {

    public static void main(String[] args) throws IOException {

        int assistantCount = 0;
        int associateCount = 0;
        int fullCount = 0;
        int facultyCount = 0;

        double assistantSalary = 0;
        double associateSalary = 0;
        double fullSalary = 0;
        double facultySalary = 0;

        try {
            URL url = new URL("http://cs.armstrong.edu/liang/data/Salary.txt");
            Scanner input = new Scanner(url.openStream());

            while (input.hasNext()) {

                String firstName = input.next();
                String lastName = input.next();
                String rank = input.next();
                double salary = input.nextDouble();

                if (rank.contains("assistant")) {
                    assistantCount++;
                    System.out.println("Rank is " + rank + " and salary is " + salary);

                } else if (rank.contains("associate")) {
                    associateCount++;
                    System.out.println("Rank is " + rank + " and salary is " + salary);
                } else {
                    fullCount++;
                    System.out.println("Rank is " + rank + " and salary is " + salary);
                }   
            }
            input.close();
        }
        catch (MalformedURLException ex) {
            ex.printStackTrace();
            System.exit(1);
        }
        catch (FileNotFoundException ex) {
            ex.printStackTrace();
            System.exit(2);
        }

    }

}

线路double salary = input.nextDouble()导致InputMismatchException 。如果我将可变工资更改为 String而不是double ,工资读取正确。如果我改变double salary = input.nextDouble()进入double salary = Double.parseDouble(input.next()) ,我猜对了double值(value)。使用这种方法并不困扰我,但我只是好奇为什么 scanner不接受 double 的工资值。

谁能解释一下为什么吗?

另外,还有一个偏离主题的子问题。如果我更改 URL object 参数中的文件名 Salary.txt到一个不存在的文件,FileNotFoundExceptioncatch statement nr2 不会被抛出,而是抛出 InputMismatchException被抛出。为什么是InputMismatchException抛出而不是 FileNotFoundException

最佳答案

您的扫描仪很可能使用了错误的区域设置。根据 Salary.txt 的值,您只需将扫描仪的区域设置更改为英语即可。试试这个:

import java.util.Locale;
...
Scanner input = new Scanner(url.openStream());
input.useLocale(Locale.ENGLISH);

关于java - 尝试从文本文件读取 double 值,但引发了 InputMismatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701607/

相关文章:

c - 如何在保存函数值的同时打印 errno?

java - 控制台上的输入不适用于此 Java 程序 - 为什么?

java - 当用户输入是一个小的 float 时扫描仪抛出

java - if else 语句没有停止问题

java - JSP表单发送数据,包括servlet中的文件

java - JNDI 查找失败(Spring、JBoss)

java - 如何停止等待 System.in 的线路?

c# - 如何在通过 FileStream 写入文件时锁定文件?

java - Android 欢迎界面等待时间太长?

java - 有没有办法让异步 I/O 操作入队?