?
一、问题描述
今天,朋友问我一个问题,他小弟在使用Scaner获取输入的时候,报了个异常,问题如下:
?
class="java">Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:819) at java.util.Scanner.next(Scanner.java:1431) at java.util.Scanner.nextInt(Scanner.java:2040) at java.util.Scanner.nextInt(Scanner.java:2000) at com.test.other.Test.main(Test.java:14)
二、问题重现
他给了我代码,我大概看了一下,自己写了个问题代码,详细代码如下:
?
public class Test { public static void main(String[] args) { int firstNum = 0; //一个int类型的变量,默认值为0 int SecondNum = 0;//一个int类型的变量,默认值为0 Scanner input = new Scanner(System.in);//获取一个输入源 System.out.println("please input First Number");//提示 firstNum = input.nextInt(); System.out.println("please input Second Number");//提示 SecondNum = input.nextInt(); } }
运行结果:
?
please input First Number 2 please input Second Number 3 Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:819) at java.util.Scanner.next(Scanner.java:1431) at java.util.Scanner.nextInt(Scanner.java:2040) at java.util.Scanner.nextInt(Scanner.java:2000) at com.test.other.Test.main(Test.java:14)
?
三、查找原因
InputMismatchException,查看源文档
public class InputMismatchException extends NoSuchElementException Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected type, or that the token is out of range for the expected type. Since: 1.5 See Also: Scanner, Serialized Form
?
Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected
type, or that the token is out of range for the expected type.
大概意思就是:这个异常由Scanner抛出,表明检索到的令牌不匹配期望类型的模式,或者该标记超出预期类型的范围。(我读出来一个东西,不是你告诉我的要读的类型,不知道是什么类型,反正我没预计到会有这么一个类型)
?结合我们这里翻译就是:你告诉我要读一个int,结果我读出来的不是一个int类型的数据。
四、代码跟踪
这里我们去看一下Scanner到底读到了什么。我们Debug模式跟进一下:
开始的时候(缓存区为空)
第一次输入一个2
第二次输入一个3
?
?五、总结问题
预计问题发生原因,第二次读取的时候获取到了hb[3]这个位置的数据
通过下面,我们更加直观的看见,缓存中hb[3]为空格字符
?很明显,空格转int肯定会报错。
六、深度分析
那么,这个空格是怎么回事呢?我们到其上一层看一下
?在这里我们看见,2后面明显3多了一点东西(其实就是一个空格),这个东西是怎么多的,我们先不管(因为我也还没找到原因),但是在这里,我们可以看见这个空格是在第一行的,也就是说,我们第二次读取的时候,是从第一行的2后面开始的,具体有没读到第二行,我们还不清楚,但是我们清楚的是nextInt()读取之后,焦点依旧会停留在上一行,不会从第二行开始读取。这就牵涉到Scanner各种读取方式的焦点是否会换行的问题。这些问题就大家自行查找了吧。
?
?
少年易学老难成,一寸光阴不可轻。
—— 与诸君共勉
?
?