Java Scaner小问题

 

一、问题描述

今天,朋友问我一个问题,他小弟在使用Scaner获取输入的时候,报了个异常,问题如下:

 

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各种读取方式的焦点是否会换行的问题。这些问题就大家自行查找了吧。

 

 

少年易学老难成,一寸光阴不可轻。

—— 与诸君共勉

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值