关于Scanner调用 sc.nextInt() 异常try后不能二次输入导致死循环问题
先看下简化的代码,引出问题所在;
public class Run {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.println("1-登录 2-注册 3-查看用户 0-退出");
int menu = sc.nextInt();
if (menu == 0) {
System.out.println("感谢使用,再见!");
break;
} else if (menu == 1) {
System.out.println("正在登录");
} else if (menu == 2) {
System.out.println("正在注册");
} else if (menu == 3) {
System.out.println("查看用户");
}
} catch (Exception e) {
System.out.println("请重新输入");
}
}
}
}
以上代码,输入字母将会无限死循环。
究其原因,是因为 scanner在要求用户输入的时候,其实是在内存中创建了一段用于用户输入,我们输入字母等就会存入该段内存。当我们用sc.nextInt()调用时,就不能调用出来,因为它不是我们要调用的int类型,这时就会报输入不匹配错误。我们用sc.nextInt()调用没把该段内存中的东西提出来,他就会一直占用这段内存,导致我们二次输入时,就不会再要求用户输入了,他会继续试图调用该段内存数值。明显地,每次都调用不出来,会报输入不匹配错误。
先看一种解决方法:
public class Run {
public static void main(String[] args) {
while (true) {
try {
System.out.println("1-登录 2-注册 3-查看用户 0-退出");
int menu = new Scanner(System.in).nextInt();
if (menu == 0) {
System.out.println("感谢使用,再见!");
break;
} else if (menu == 1) {
System.out.println("正在登录");
} else if (menu == 2) {
System.out.println("正在注册");
} else if (menu == 3) {
System.out.println("查看用户");
}
} catch (Exception e) {
System.out.println("请重新输入");
}
}
}
}
这个解决方法,每次在调用用户输入方法时都会new 一个scanner对象,会占用我们的内存。所以效果其实并不好。
我们再看另一种解决方法:
就是我们清空该段用于用户输入的内存,或者把该段内存中的数值取出。所以我们在catch块中使用 sc.next(); 就可以解决。因为我们知道sc.next()是得到字符串所以可以把该段内存中的值取出。
public class Run {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.println("1-登录 2-注册 3-查看用户 0-退出");
int menu = sc.nextInt();
if (menu == 0) {
System.out.println("感谢使用,再见!");
break;
} else if (menu == 1) {
System.out.println("正在登录");
} else if (menu == 2) {
System.out.println("正在注册");
} else if (menu == 3) {
System.out.println("查看用户");
}
} catch (Exception e) {
sc.next();
System.out.println("请重新输入");
}
}
}
}
借鉴出处:https://blog.csdn.net/huan_mie/article/details/5949948
关于Scanner调用 sc.nextInt() 异常try后不能二次输入导致死循环问题的更多相关文章
- 解决由于服务器调用删除或添加字段后CXF客户端未更新导致异常问题org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unexpected element
采用CXF客户端调用Webservice服务,由于服务端时不时会对Webservice服务删除或添加一些字段,而CXF未及时更新客户端代码导致再次调用服务时报异常错误: Interceptor for ...
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- 程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验
1,程序异常崩溃后用windbg辅助调试解决的经验 状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ...
- atitit.架构设计---方法调用结果使用异常还是返回值
atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...
- controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化
controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化
- Linux异常关机后,Mysql启动出错ERROR 2002 (HY000)
Linux异常关机后,Mysql启动或訪问时,出错: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ ...
- # vmware异常关机后,虚拟系统无法启动的解决办法
vmware异常关机后,虚拟系统无法启动的解决办法 先使用everything搜索所有后缀为.lck的文件,这些文件全部删除,如果不确定是否可以删除,先把这些文件转移到桌面,等能启动虚拟系统之后再删除 ...
- 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?
探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 线上多个服务应用陷入了死 ...
- Java初学者作业——分析计费规则后,编写程序输入乘坐出租车的时间和里程数,计算里程价格
返回本章节 返回作业目录 需求说明: 某城市的出租车计费规则如下: 在 7:00 - 23:00 之间,3km 以内收取起步价 10 元,超过 3km 每 km 收取 2 元. 如果不在这个时间段,在 ...
随机推荐
- JavaScript作用域、作用域链 学习随笔
(本文是这些知识点的自我理解.写之余从头回顾,加深理解.取得更多收获之用.) 作用域(scope) 程序设计概念,通常来说,一段程序代码中所用到的名字(JS叫标识符(如变量名.函数名.属性名.参数.. ...
- 【robotframework】robotframework环境搭建
一.基于python3.6环境 在dos命令输入 pip install robotframework 在线安装robotframework在dos命令输入 pip install Pypubsub= ...
- 虚拟机VMware安装
1.进入VMware官网,下载 (点击进入官网) 2.下载镜像文件 (点击进入官网下载) 3.下载好后,打开VMware,点击创建新的虚拟机 4.点击下一步,并找到刚才下载好的镜像文件 5.跟随系统点 ...
- 极度舒适的 Python 入门教程,小猪佩奇也能学会~
编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...
- html的基础知识点
小编为大家带来html的基础知识Web 标准的好处让Web的发展前景更广阔 内容能被更广泛的设备访问更容易被搜寻引擎搜索降低网站流量费用使网站更易于维护提高页面浏览速度Web 标准构成Web标准不是某 ...
- DNS服务——正向查找区 和 逆向查找区
前言 正向查找区,就是我们最熟知的DNS.即根据域名解析成IP 逆向查找区,即根据IP解析成域名. 他们之间的关系很像ARP和RARP 正向查找区 /etc/named.rfc1912.zones用于 ...
- 使用BCP实用工具导出导入数据
https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-ver15 bcp 实用工具可以在 Microsoft S ...
- 移动端自适应js
window.addEventListener('resize', setHtmlFontSize) setHtmlFontSize(); function setHtmlFontSize() { v ...
- 《SVN的操作流程及规范》
安装说明: 下载路径:https://tortoisesvn.net/downloads.html 选择对应版本: 安装中文语言包: 右键进入setting设置,选择中文简体. 使用说 ...
- uoj#67 新年的毒瘤【Tarjan】
题目:http://uoj.ac/problem/67 题意:n个节点m条边的图,删除某个节点及他相连的所有边之后,剩下的图就成了一棵树.找出所有这样的节点. 思路:上次去清华面试的B题,当时就是在瞎 ...