一、问题描述
今天,朋友问我一个问题,他小弟在使用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各种读取方式的焦点是否会换行的问题。这些问题就大家自行查找了吧。
少年易学老难成,一寸光阴不可轻。
—— 与诸君共勉
相关推荐
8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.javaScanner类.zip8.java...
Java Scanner File PrintWriter使用实例
### Java Scanner 类的使用详解 #### 一、简介与应用场景 `java.util.Scanner` 是 Java SDK 1.5 版本引入的一个类,用于简化文本扫描任务,它能够解析基本类型(如 `int`, `double`)以及字符串类型的数据。在进行...
Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序 Scanner类Java SE程序...
Java Deserialization Scanner 是一款针对Java反序列化漏洞的检测和利用工具,它是Burp Suite中的一个插件。这款插件的目的是帮助安全研究人员检测应用程序中可能存在的Java反序列化漏洞,这些漏洞可能导致远程代码...
### Java中Scanner类的用法详解 #### 一、引言 `Scanner`类作为Java SDK 1.5中引入的新特性,为开发者提供了一种简单直观的方式来读取用户输入和解析文本文件中的数据。相比于之前的`StringTokenizer`和`Matcher`类...
### Java中Scanner类的用法 #### 一、概述 `Scanner`类是Java标准库中的一个类,属于`java.util`包的一部分。它在Java 5.0版本被引入,目的是为了简化输入输出控制的过程,相较于传统的输入输出流控制(如`...
Java 基础之 Scanner 键盘录入 Java 中的 Scanner 键盘录入是 Java 前期学习中非常重要的一个知识点,它可以用来模拟现实中的前端向后台传输数据的情形,便于我们理解和学习 Java。下面是对 Scanner 键盘录入的详细...
36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入Scanner.zip36.java数据输入...
Java Scanner 类是Java标准库提供的一种输入处理类,主要用于从各种输入源(如键盘、文件、字符串等)读取用户输入的数据。它属于Java中的引用数据类型,这意味着使用Scanner类时,我们需要创建Scanner对象并调用其...
本文主要探讨的是当SonarScanner在连接SonarQube 7版本时遇到`sonar.java.binaries`问题的解决方案。 首先,问题的起因是由于SonarQube的Java插件版本升级导致的。在4.12版本之后,SonarQube要求用户明确指定`sonar...
JAVA Scanner输入.pdf
初学者可以轻松掌握的java代码,里面有比较常见的java类方法等
在Java编程语言中,`Scanner`类是Java.util包下的一个重要的输入处理工具,它用于从各种源(如系统输入流、文件、字符串)读取基本类型的数据和字符串。`Scanner`类提供了丰富的接收方法来方便程序员进行输入操作。...
在Java中,通过`java.util.Scanner`包可以导入并使用`Scanner`类。 在程序开发中,`Scanner`类主要用于从标准输入流(如键盘输入)或其他输入源(如文件)读取数据。创建`Scanner`对象的基本语法如下: ```java ...
Java Scanner 类是Java IO包中的一个重要类,它主要用于从各种数据源,如键盘输入、文件、字符串等读取数据。面试中,Scanner类经常作为考察点,因为它在实际编程中有着广泛的应用。以下是关于Scanner类的一些常见...
Java Scanner 类的使用 Java Scanner 类是 Java 5 中的一个新特征,用于实现程序与人的交互,我们可以通过 Scanner 类来获取用户的输入。Scanner 类位于 java.util 包中,可以通过创建一个扫描对象来接收键盘输入。...
### Java中的Scanner类详解 #### 一、简介 在Java编程语言中,为了实现与用户的交互,即获取用户的输入,通常会用到`java.util.Scanner`类。该类提供了多种方法来读取不同数据类型的输入,例如整数、浮点数、字符...
### Java 输入语句 `Scanner` 使用详解 #### 一、`Scanner` 类简介 在 Java 编程语言中,`Scanner` 类是一个非常实用且重要的类,它位于 `java.util` 匢中。该类的主要功能是用于从各种输入源(如键盘、文件或字符...
2. **性能问题**:尽管 `Scanner` 类非常易于使用,但它在性能上可能不如 `BufferedReader` 或 `DataInputStream`。对于大量数据的处理,建议考虑使用其他方式。 #### 七、总结 `Scanner` 类为 Java 开发者提供了...