【问题标题】:Can someone tell me what's wrong with this java code?有人能告诉我这个java代码有什么问题吗?
【发布时间】:2013-07-28 03:42:34
【问题描述】:

我不断收到类似这样的错误,我不知道为什么:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at Assignment20.main(Assignment20.java:17)

这是我的代码

import java.util.Scanner;
import java.io.File;

public class Assignment20{



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

    File myFile = new File("scores.txt");

    Scanner input = new Scanner(myFile);

while (input.hasNext()) {
  String firstName = input.next();
  String mi = input.next();
  String lastName = input.next();
  int score = input.nextInt();
  System.out.println(
    firstName + " " + mi + " " + lastName + " " + score);
}


input.close();


}
}

我试图让它读取的文本文件看起来像这样

哈利波特,72

罗恩·韦斯莱,68 岁

赫敏格兰杰,98

阿不思·邓布利多,90

纳威隆巴顿,75

卢娜·洛夫古德,86 岁

德拉科马尔福,64

赵昌,88 岁

金妮·韦斯莱,78 岁

汤姆·里德尔,92

我需要做什么来解决这个问题?

编辑:我更改了文本文件,但它仍然无法正常工作,我得到了同样的错误。有人可以告诉我固定的代码吗?我不明白我必须做什么。

【问题讨论】:

  • 提示:尝试打印出 firstName、mi 和 lastName(在尝试读取 int 之前),看看会得到什么
  • 想一想,看看你的文本文件的结构。它是否与您要在代码中检索的数据匹配?!

标签: java


【解决方案1】:

默认的Scanner 分隔符是一个空格。因此,您的一个next() 调用正在使用姓氏和分数(例如“Potter,72”)。因此,nextInt() 调用失败。

此外,当您只有两个值时,您似乎正在尝试读取四个值(考虑到 Scanner 将姓氏和分数视为一个)。选择空格或逗号作为分隔符。如果您选择使用逗号分隔值,那么也请使用 Scanner#useDelimiter(",")

Harry,Potter,72
Ron,Weasley,68

考虑到上面的文件格式(csv),您可以使用下面的代码。

Scanner input = new Scanner(myFile).useDelimiter(",");

while (input.hasNextLine()) {
    String[] line = input.nextLine().split(",");
    String firstName = line[0];
    String lastName = line[1];
    int score = Integer.parseInt(line[2]);
    System.out.println(firstName + " " + lastName + " " + score);
}

【讨论】:

    【解决方案2】:

    异常是不言自明的。您正在读取的参数与您分配给它的参数类型不匹配。 最可能的错误区域是int score = input.nextInt();

    仅出于调试目的,我建议将 int score = input.nextInt(); 替换为 int score = input.next(); 。这将帮助您确定错误。

    【讨论】:

      【解决方案3】:

      您需要修复将输入放入程序的文本文件。首先,文本记录中行的格式应该是Tom Riddle , 92 而不是Tom Riddle,92。中间名和逗号“,”之间以及分数之间的空格应该在那里。否则,Riddle,92 被读取为单个令牌,当这个令牌是字符串时,会导致错误,而整数 score

      【讨论】:

        【解决方案4】:

        您的文本文件结构不合理,请使用空格分隔值。而且由于您的文件不包含任何中间名,因此无需检索。

        更改文本文件的结构如下:

        Scores.txt

        Harry Potter 72
        Ron Weasley 68
        Hermione Granger 98
        Albus Dumbledore 90
        Neville Longbottom 75
        Luna Lovegood 86
        Draco Malfoy 64
        Cho Chang 88
        Ginny Weasley 78
        Tom Riddle 92
        

        试试这个:

        import java.util.Scanner;
        import java.io.File;
        
        public class test {
        
        public static void main(String[] args) throws Exception {
        
            File myFile = new File("scores.txt");
        
            Scanner input = new Scanner(myFile);
        
            while (input.hasNext()) {
                String firstName = input.next();
        
                String lastName = input.next();
        
                int score = input.nextInt();
                System.out.println(firstName + " " + lastName + " " + score);
            }
        
            input.close();
        
        }
        

        }

        【讨论】:

        • 这给了我以下错误:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 at Assignment20.main(Assignment20.java:18)
        猜你喜欢
        • 2021-05-22
        • 2020-02-21
        • 2020-10-30
        • 2010-11-08
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2013-05-10
        相关资源
        最近更新 更多