代码不久前就开始工作了;java.util.InputMismatchException“;

代码不久前就开始工作了;java.util.InputMismatchException“;,java,java.util.scanner,inputmismatchexception,Java,Java.util.scanner,Inputmismatchexception,别紧张,我自学成才,对这一切都很陌生。 所以我想写一本通讯录。一切正常,没有错误,没有例外。保存了项目,关掉了笔记本电脑,去吃午饭。返回,尝试运行代码,收到错误 根据例外情况,我知道这与我的扫描仪有关。 突出显示了例外情况 int phone = inFile.nextInt() 问题就在这里。但是我想不出它有什么问题 Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throw

别紧张,我自学成才,对这一切都很陌生。 所以我想写一本通讯录。一切正常,没有错误,没有例外。保存了项目,关掉了笔记本电脑,去吃午饭。返回,尝试运行代码,收到错误

根据例外情况,我知道这与我的扫描仪有关。 突出显示了例外情况

int phone = inFile.nextInt()  
问题就在这里。但是我想不出它有什么问题

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)
at test.AddressBook.main(AddressBook.java:255)
代码


在Java中,一些分隔符拆分器使用空/空标记,而其他分隔符拆分器则不使用。 如果您有
| |
| notInt |
并且运行了
scanner.nextInt()
,您将得到一个ImputMissmatchException

Scanner i =
        new Scanner("Jeremy|Ronald|Wright|43|||Family Member|06|04|2013|06666-9139\n").useDelimiter("[|\\n]");
    while (i.hasNext()) {
        for (int j = 0; j < 3; j++) {
            System.out.println(i.next());
        }
        for (int j = 3; j < 6; j++) {
            int loc = i.nextInt();   // here i get same exception  
                                     // when reading next int after 43
            System.out.println(loc);
        }
    }
将输出:

----扫描仪定界符------------------------------
“杰里米”
“罗纳德”
"433"
""
""
"06"
"04"
"2013"
"06666-9139"
---------------字符串拆分---------------------
“杰里米”
“罗纳德”
"433"
""
""
"06"
"04"
"2013"
"06666-9139"
-------------字符串标记器-----------------------
“杰里米”
“罗纳德”
"433"
"06"
"04"
"2013"

“06666-9139”

逐行读取拆分,解析将有助于避免此类问题

    while (inFile.hasNext()) {
        String line = inFile.nextLine();
        String[] tokens = line.split("\\|");
        String fName = tokens[0];
        String mName = tokens[1];
        String lName = tokens[2];
        int phone = Integer.parseInt(tokens[3]);
        String relationship = tokens[4];
        int day = Integer.parseInt(tokens[5]);
        int month = Integer.parseInt(tokens[6]);
        int year = Integer.parseInt(tokens[7]);
        String street = tokens[8];
        String city = tokens[9];
        String state = tokens[10];
        String zipCode = tokens[11];
    }

使用文本文件片段执行此操作对我来说很好。

您可以发布示例数据吗?该错误只是意味着它遇到了与您期望的类型不匹配的类型。在本例中,我想象它在期望整数时找到了一个字符串。如果让我猜的话,我会说你的文件看起来像:FirstName
| \n
| \n
u LastName
| \n
124;某个意外字符串
| \n
u RemainingData…或者一个无法解析为
int的电话号码
(比如,一个电话号码,转换成
int
,将大于
Integer.MAX_VALUE
)我已经发布了示例数据。这让我很困惑,在数据上,电话是int。如果删除
main()中的前4条打印语句
,失败前打印的是什么?根据您的示例数据,您应该试试OpenCSV
Jeremy|Ronald|Wright|4331732|Family Member|06|04|2013|Eastlawn|Orange Cove|Texas|06666-9139
Heather|Paula|Perkins|7285248|Friends|04|06|2013|Bashford|Yuba City|New Mexico|99585-6820
Edward|Stephen|Allen|7186971|Family Member|25|06|2013|Reinke|Downey|Arizona|15915-9508
Dorothy|Philip|Robinson|8932173|Business Associate|15|07|2013|Harper|La Verne|Montana|37275-3957
Joan|Harry|Wilson|3859088|Business Associate|01|02|2014|Eastlawn|Antioch|Maryland|85923
Scanner i =
        new Scanner("Jeremy|Ronald|Wright|43|||Family Member|06|04|2013|06666-9139\n").useDelimiter("[|\\n]");
    while (i.hasNext()) {
        for (int j = 0; j < 3; j++) {
            System.out.println(i.next());
        }
        for (int j = 3; j < 6; j++) {
            int loc = i.nextInt();   // here i get same exception  
                                     // when reading next int after 43
            System.out.println(loc);
        }
    }
    System.out.println("------Scanner Delimiter------------------------------");
    Scanner i =
        new Scanner("Jeremy|Ronald|433|||06|04|2013|06666-9139").useDelimiter("[|]");
    while (i.hasNext()) {           
            System.out.println("\""+i.next()+"\"");         
    }
    System.out.println("---------------String split---------------------");

     String[] result = "Jeremy|Ronald|433|||06|04|2013|06666-9139".split("[|]");
     for(String s: result)
         System.out.println("\""+s+"\"");

    System.out.println("-------------String Tokenizer-----------------------");

     StringTokenizer st = new StringTokenizer("Jeremy|Ronald|433|||06|04|2013|06666-9139", "|");
     while (st.hasMoreTokens()) {
         System.out.println("\""+st.nextToken()+"\"");
     }
    while (inFile.hasNext()) {
        String line = inFile.nextLine();
        String[] tokens = line.split("\\|");
        String fName = tokens[0];
        String mName = tokens[1];
        String lName = tokens[2];
        int phone = Integer.parseInt(tokens[3]);
        String relationship = tokens[4];
        int day = Integer.parseInt(tokens[5]);
        int month = Integer.parseInt(tokens[6]);
        int year = Integer.parseInt(tokens[7]);
        String street = tokens[8];
        String city = tokens[9];
        String state = tokens[10];
        String zipCode = tokens[11];
    }