0

我已经尝试过这个代码片段,但无法弄清楚这个异常的原因。

我的代码是:-

import java.util.*;
class ScannerTest
{
 public static void main(String[]args)
  {
    String csv = "Sue,5,true,3";
    Scanner sc = new Scanner(csv);
    sc.useDelimiter(",");
    int age = sc.nextInt();
    System.out.println(age);
  }
}

输出是: -

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.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)

我是java新手,所以请帮助我了解这个异常的原因。

4

3 回答 3

4

在 javadoc 示例中,您可以看到它是如何工作的:

String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 

你的第一个标记是一个字符串。如果您使用 next int 它需要一个整数。你可能想要使用这样的东西(在你知道 csv 的结构并且它不会改变的条件下):

public static void main(String[]args)
      {
        String csv = "Sue,5,true,3";
        Scanner sc = new Scanner(csv);
        sc.useDelimiter(",");
        sc.next();
        int age = sc.nextInt();
        System.out.println(age);
      }

或者

public static void main(String[] args) {
        String csv = "Sue,5,true,3";
        String ageString = csv.split(",")[1];
        System.out.println(ageString);
    }

...

将字符串解析为 int:

int age = Integer.parseInt(ageString);
于 2012-08-04T11:41:42.597 回答
3

Scanner的 nextInt 方法的 Javadoc状态

将输入的下一个标记扫描为 int。如果下一个标记无法转换为有效的 int 值,则此方法将抛出 InputMismatchException,如下所述。如果翻译成功,扫描仪会超过匹配的输入。

由于您的第一个令牌是一个字符串,这就是正在发生的事情。在大多数情况下,在 CSV 中,您会知道将呈现什么,您应该逐一阅读它们,和/或使用hasNextInt方法及其朋友来检查您所期望的是否真的存在。

于 2012-08-04T11:39:31.727 回答
1

扫描仪需要一个整数类型,但第一个标记是一个字符串 - "Sue",要修复,放置:

sc.next(); // skip "Sue"

在调用 nextInt() 以使用 String 令牌之前。

于 2012-08-04T11:38:29.510 回答