先看下简化的代码,引出问题所在;

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后不能二次输入导致死循环问题的更多相关文章

  1. 解决由于服务器调用删除或添加字段后CXF客户端未更新导致异常问题org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unexpected element

    采用CXF客户端调用Webservice服务,由于服务端时不时会对Webservice服务删除或添加一些字段,而CXF未及时更新客户端代码导致再次调用服务时报异常错误: Interceptor for ...

  2. [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)

    无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...

  3. 程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验

    1,程序异常崩溃后用windbg辅助调试解决的经验  状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ...

  4. atitit.架构设计---方法调用结果使用异常还是返回值

    atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...

  5. controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化

    controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化

  6. Linux异常关机后,Mysql启动出错ERROR 2002 (HY000)

    Linux异常关机后,Mysql启动或訪问时,出错: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ ...

  7. # vmware异常关机后,虚拟系统无法启动的解决办法

    vmware异常关机后,虚拟系统无法启动的解决办法 先使用everything搜索所有后缀为.lck的文件,这些文件全部删除,如果不确定是否可以删除,先把这些文件转移到桌面,等能启动虚拟系统之后再删除 ...

  8. 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?

    探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 线上多个服务应用陷入了死 ...

  9. Java初学者作业——分析计费规则后,编写程序输入乘坐出租车的时间和里程数,计算里程价格

    返回本章节 返回作业目录 需求说明: 某城市的出租车计费规则如下: 在 7:00 - 23:00 之间,3km 以内收取起步价 10 元,超过 3km 每 km 收取 2 元. 如果不在这个时间段,在 ...

随机推荐

  1. 监听iframe加载完成

    用 @load="loading" 在Vue里面写了一个界面,有一个iframe标签, iframe加载其他网站, <iframe @load="loading&q ...

  2. iOS开发微信支付的介绍与实现

    1.前期准备 1) 到微信开放平台注册账号 需要登录邮箱验证 填写您的商户信息 2) 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料 3) 审核过后,通过应用详情页 ...

  3. 配置和查看composer镜像

    composer 默认地址改为中国镜像地址,以及中国镜像地址还原成默认地址 一.查看当前镜像地址 在命令行输入如下命令,即可查看全局镜像地址: $ composer config -g repo.pa ...

  4. Linux-开机启动程序

    尝试一下几种方法: 1.修改  /etc/rc.local文件. 在exit0 前添加启动命令 2.在/home/pi/.config/autostart/  下添加.desktop 在.config ...

  5. Dism++备份还原系统

    使用dism++备份和还原需要下载该工具,并选择与系统对应的Dism++x64或Dism++x32运行进行操作. Dism++网络下载地址:http://www.chuyu.me/zh-Hans/in ...

  6. scrapy框架介绍

    一,介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性 ...

  7. 目录-java并发基础知识

    ====================== 1.volatile原理 2.ThreadLocal的实现原理(源码级) 3.线程池模型以及核心参数 4.HashMap的实现以及jdk8的改进(源码级) ...

  8. es其他常用功能

    es6除了模块化,class,promise,还有一些其他的常用功能. 1.let/const let是定义一个变量,但是这个变量可以重新赋值,const是定义一个常量,这个常量不能重新赋值 let ...

  9. evpp下载1个文件

    上传一个文件无错误 如何下载一个文件?? 集群?? http pdf 直接 redbuf

  10. python-selenium安装笔记

    python-selenium操作火狐,谷歌,360,ie 亲测可用,windows环境 python3.6 由于python2到2020年不进行维护所有都用python3 selenium pip ...