线程main中的异常 - java.util.InputMismatchException

时间:2015-08-24 11:38:09

标签: java eclipse multithreading exception

我一直在为傻瓜阅读Java,我遇到了这个错误:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)
    at TeamFrame.<init>(TeamFrame.java:18)
    at ShowTeamFrame.main(ShowTeamFrame.java:7)

这是代码:

import java.text.DecimalFormat;

public class Player {   
    private String name;
    private double average; 

    public Player(String name, double average) {
        this.name=name;
        this.average=average;
    }

    public String getName() {
        return name;
    }

    public double getAverage() {
        return average;
    }

    public String getAverageString() {
        DecimalFormat decFormat = new DecimalFormat();
        decFormat.setMaximumIntegerDigits(0);
        decFormat.setMaximumFractionDigits(3);
        decFormat.setMinimumFractionDigits(3);
        return decFormat.format(average);    
    }
}


import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.GridLayout;

@SuppressWarnings("serial")
public class TeamFrame extends JFrame {

    public TeamFrame() throws IOException {
         Player player;
        Scanner hankeesData = 
                    new Scanner(new File("d:/eclipse/Workplace/10-02 book/Hankees.txt"));

        for (int num = 1; num <= 9; num++) {
             player = new Player(hankeesData.nextLine(),
                    hankeesData.nextDouble());
            hankeesData.nextLine();

            addPlayerInfo(player);
        }        

        setTitle("The Hankees");
        setLayout(new GridLayout(9, 2, 20, 3));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);

        hankeesData.close();
    }

    void addPlayerInfo(Player player) {
        add(new JLabel("  " + player.getName()));
        add(new JLabel(player.getAverageString()));
    }   
}

import java.io.IOException;

class ShowTeamFrame {

    public static void main(String args[]) 
                               throws IOException {
        new TeamFrame();
    }
}

这是.txt文件:

Barry Burd
.101
Harriet Ritter
.200
Weelie J. Katz
.030
Harry "The Crazyman" Spoonswagler
.124
Filicia "Fishy" Katz
.075
Mia, Just "Mia"
.111
Jeremy Flooflong Jones
.102
I. M. D'Arthur
.001
Hugh R. DaReader
.212

它直接来自本书的网站,所以我认为一定没有错误。

3 个答案:

答案 0 :(得分:4)

在创建hankeesData后将其插入代码中:

hankeesData.useLocale(java.util.Locale.ENGLISH);

我注意到如果“。”你的程序有效。被替换为“,”,新代码现在告诉Scanner使用英语方法。

更新: 如果你在最后一个输入行得到NoSuchElementException: No line found,那么这是因为你的最后一行没有\ n。使用hasNextLine(),如HyperZ答案末尾附近所示。

答案 1 :(得分:1)

文本文件的格式应如下:

Barry Burd
,101
Harriet Ritter
,200
Weelie J. Katz
,030
Harry "The Crazyman" Spoonswagler
,124
Filicia "Fishy" Katz
,075
Mia, Just "Mia"
,111
Jeremy Flooflong Jones
,102
I. M. D'Arthur
,001
Hugh R. DaReader
,212

所以问题是类型double的值是像x.xxx而不是x,xxx那样提供的,这导致了异常!

这解决了当前的异常,但是如果代码保持不变,您将收到另一个错误:Exception in thread "main" java.util.NoSuchElementException: No line found

让我们看一下for循环:

for (int num = 1; num <= 9; num++) {
    player = new Player(hankeesData.nextLine(),
                hankeesData.nextDouble());
    hankeesData.nextLine(); // Go to next line, this is causing the problem
    addPlayerInfo(player);
}

当迭代最后一次(即num = 9)时,我们读取了玩家的名字,然后我们读取它的平均值。但是我们再次hankeesData.nextLine();! 但是,平均值是此文本文件中的最后一行,并且没有其他内容可供阅读,因此最后一次执行hankeesData.nextLine();将导致No line found异常。

for (int num = 1; num <= 9; num++) {
    player = new Player(hankeesData.nextLine(),
                    hankeesData.nextDouble());

    if (hankeesData.hasNextLine())
       hankeesData.nextLine(); // Go to next line, only if there is a next line!

    addPlayerInfo(player);
}

答案 2 :(得分:-2)

您的异常是InputMismatchException方法抛出的Scanner.nextDouble()。在Javadocs for Scanner中,声明InputMismatchException被抛出

  

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

在相同的文档中,我们可以找到Float正则表达式。

Float:
    Decimal | HexFloat | SignedNonNumber

Decimal:
    ( [-+]? DecimalNumeral Exponent? )
    | LocalPositivePrefix DecimalNumeral LocalPositiveSuffix Exponent?
    | LocalNegativePrefix DecimalNumeral LocalNegativeSuffix Exponent?

HexFloat:
    [-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ ([pP][-+]?[0-9]+)?

NonNumber:
   NaN | LocalNan | Infinity | LocalInfinity

SignedNonNumber:
    ( [-+]? NonNumber )
    | LocalPositivePrefix NonNumber LocalPositiveSuffix
    | LocalNegativePrefix NonNumber LocalNegativeSuffix

对于你的情况,唯一重要的部分是十进制,正则表示基数为10的双数。

要修复您的代码,请尝试添加以下内容:

 if(!hankeesData.hasNextLine()){
     break;
 }

之前:

 hankeesData.nextLine();