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

 

 

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

—— 与诸君共勉

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### Java 中 `Scanner` 类的使用教程 #### 创建 `Scanner` 对象 为了能够读取来自控制台或其他输入源的数据,首先需要导入 `java.util.Scanner` 并创建一个 `Scanner` 实例。基本语法如下所示: ```java import java.util.Scanner; Scanner scanner = new Scanner(System.in); ``` 这段代码初始化了一个新的 `Scanner` 对象用于监听标准输入流[^1]。 #### 获取不同类型的数据 `Scanner` 提供了一系列的方法来解析不同类型的原始数据类型和字符串。下面列举了一些常见的方法及其用途: - **整数**: 使用 `nextInt()` 可以读入下一个完整的整数值。 - **浮点数**: 调用 `nextDouble()` 或者 `nextFloat()` 来捕获下一次输入中的双精度或单精度实数。 - **字符序列 (String)**: 通过调用 `next()` 和 `nextLine()` 方法分别用来获取不带空白符的一串字符或是整个行的内容[^3]。 需要注意的是当混合使用 `nextXXX()` 和 `nextLine()` 函数时可能会遇到一些意想不到的行为,因为前者不会消耗掉换行符而后者会自动跳过前导空白直到找到第一个非空白字符为止[^4]。 #### 示例程序:简单交互应用 这里给出一段简单的例子展示怎样利用 `Scanner` 进行基本的人机对话并执行相应操作——比如计算BMI指数: ```java import java.util.Scanner; public class BMICalculator { public static void main(String[] args){ double weight,height,bmi; System.out.print("请输入您的体重(kg): "); Scanner sc=new Scanner(System.in); weight=sc.nextDouble(); System.out.print("请输入您的身高(meter): "); height=sc.nextDouble(); bmi=weight/(height*height); System.out.printf("您的身体质量指数(BMI)为 %.2f\n",bmi); } } ``` 此段代码展示了如何结合提示信息引导用户依次键入自己的体重与身高等参数,并最终输出计算所得的身体质量指数(BMI)。这不仅体现了 `Scanner` 的易用性和灵活性,同时也说明了它在日常编程实践里的广泛应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值