Java Scaner小问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java Scaner小问题

Java Scaner小问题

 2017/10/23 15:47:19  岁月之眸  程序员俱乐部  我要评论(0)
  • 摘要:一、问题描述今天,朋友问我一个问题,他小弟在使用Scaner获取输入的时候,报了个异常,问题如下:Exceptioninthread"main"java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:819)atjava.util.Scanner.next(Scanner.java:1431)atjava.util.Scanner.nextInt(Scanner.java:2040)atjava
  • 标签:can Java 问题

?

一、问题描述

今天,朋友问我一个问题,他小弟在使用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各种读取方式的焦点是否会换行的问题。这些问题就大家自行查找了吧。

?

?

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

—— 与诸君共勉

?

?

  • 大小: 6.7 KB
  • 大小: 10.2 KB
  • 大小: 1.4 KB
  • 大小: 14.9 KB
  • 查看图片附件
发表评论
用户名: 匿名