如何解决InputMismatchException?

时间:2014-05-30 16:41:25

标签: java user-interface

这是我的代码

while(scan_movie_theater.hasNext()){                    
        line = scan_movie_theater.next();
        i = scan_movie_theater.nextInt();
        System.out.println(line);
        System.out.println(i);          
    }
    scan_movie_theater.close();

我的文字就像

dsa 435
salon 123
xxxx 123214324
trump tower 15

如何修复inputmismatchexception?

谢谢。

5 个答案:

答案 0 :(得分:0)

尝试按照。并强烈建议调试您的代码,看看出了什么问题。我是你最好的伙伴。 :)

while (scan_movie_theater.hasNextLine()) {
            String line = scan_movie_theater.nextLine();
            String[] words = line.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

            System.out.println(words[0]);
            System.out.println(Integer.valueOf(words[1]));
        }

然后你可以拆分任何数字的字符串。如果您的格式一致,这应该有效。请参阅字符串拆分号here.

答案 1 :(得分:0)

方法Scanner.next()定义为here

  

查找并返回此扫描仪的下一个完整令牌。一个   完整标记之前和之后是匹配的输入   分隔符模式。

默认分隔符是\ p {javaWhitespace} +(由Scanner.delimiter()返回),它匹配isWhitespace()验证的任何字符。

对于你的情况,如果你确定一个整数是行中的最后一个标记,那么在调用nextInt()之后调用.nextLine():

while(scan_movie_theater.hasNext()){                    
        line = scan_movie_theater.next();
        i = scan_movie_theater.nextInt();
        scan_movie_theater.nextLine();// catch the carriage return and point to the next line if it exist
        System.out.println(line);
        System.out.println(i);          
    }
    scan_movie_theater.close();

答案 2 :(得分:0)

嗯,你说有两个单词的空格特朗普塔,这当然会有例外。

<强>溶液

您可以捕获该异常并检查其是 int 还是字符串 ..

while(scan_movie_theater.hasNext()){                    
    line = scan_movie_theater.next();

try { 
    int s = Integer.parseInt(line ); 
    System.out.println("I am integer" + s);
} catch(NumberFormatException e) { 
    System.out.println("I am String" + line);
}

}
scan_movie_theater.close();

答案 3 :(得分:0)

最有可能首先next()选择dsa,然后nextInt()选择435,第二next()选择回车。因此,第二个nextInt()选择salon,导致您的不匹配异常。就像我说的那样,只需逐行阅读,拆分行并解析int。

编辑:

对于两个或更多单词,您需要获取整数的索引并获取子字符串

public class Test {
    public static void main(String[] args) {
        String line = "Trump Tower 23445";
        int pos = line.replaceFirst("^(\\D+).*$", "$1").length();
        String number = line.substring(pos);
        System.out.println(Integer.parseInt(number));
        System.out.println(line.substring(0, pos));
    }
}

结果

  

23445

     

特朗普大厦

如果正则表达式太难理解,你总是可以创建一个方法来获取第一个int的索引

public static int getIndexOfFirstInt(String line) {
    char[] chars = line.toCharArray();
    for (char c : chars) {
        if (Character.isDigit(c)) {
            return line.indexOf(c);
        }
    }
    return -1;
}

答案 4 :(得分:0)

如果在整数之前字符串中有空格,请尝试此操作。

while (scan_movie_theater.hasNext()) {
            String[] data = scan_movie_theater.nextLine().split(" +");
            i = Integer.parseInt(data[data.length - 1]);
            line = data[0];
            for (int j = 1; j < data.length - 2; ++j)
                line +=" "+ data[j];
            System.out.println(line);
            System.out.println(i);
        }
        scan_movie_theater.close();