欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Scaner小问题 博客分类: Java异常 JavaInputMismatchException 

程序员文章站 2024-03-25 16:16:10
...

 

一、问题描述

今天,朋友问我一个问题,他小弟在使用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

Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 

第二次输入一个3


Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
 

 五、总结问题

预计问题发生原因,第二次读取的时候获取到了hb[3]这个位置的数据

通过下面,我们更加直观的看见,缓存中hb[3]为空格字符
Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
 很明显,空格转int肯定会报错。

六、深度分析

那么,这个空格是怎么回事呢?我们到其上一层看一下


Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
 在这里我们看见,2后面明显3多了一点东西(其实就是一个空格),这个东西是怎么多的,我们先不管(因为我也还没找到原因),但是在这里,我们可以看见这个空格是在第一行的,也就是说,我们第二次读取的时候,是从第一行的2后面开始的,具体有没读到第二行,我们还不清楚,但是我们清楚的是nextInt()读取之后,焦点依旧会停留在上一行,不会从第二行开始读取。这就牵涉到Scanner各种读取方式的焦点是否会换行的问题。这些问题就大家自行查找了吧。

 

 

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

—— 与诸君共勉

 

 

  • Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
  • 大小: 6.7 KB
  • Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
  • 大小: 10.2 KB
  • Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
  • 大小: 1.4 KB
  • Java Scaner小问题
            
    
    博客分类: Java异常 JavaInputMismatchException 
  • 大小: 14.9 KB