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

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. iOS音频学习笔记一:常见音频封装格式及编码格式

    (1) pcm格式    pcm是经过话筒录音后直接得到的未经压缩的数据流    数据大小=采样频率*采样位数*声道*秒数/8     采样频率一般是22k或者44k,位数一般是8位或者16位,声道一 ...

  2. jquery-weui滚动事件的注册与注销

    注册infinite(50)是自定义的,详细暂时没去了解,可以不写即代表默认值. // body是整一块代码的标签,也就是滚动的部分. $('body').infinite().on("in ...

  3. java基础点

    1.eclipse什么时候编译java类文件 2.在同一包中的类可以相互引用,无需用import语句 3.在Java eclipse用ALT输入特殊符号 4.if else等语句,什么时候可以不加括号 ...

  4. dnmp安装

    centos7.2.box下载地址 链接: https://pan.baidu.com/s/1ny20PN2x7YuA6dwYA-P0yQ 提取码: wrdk 1 下载centos.box 新建dnm ...

  5. Powershell-加域脚本

    $domain = "abc" $password = "mima" | ConvertTo-SecureString -asPlainText -Force ...

  6. mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)

    单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...

  7. 24 结合webpack使用vue-router

    启用路由 参考官网:https://router.vuejs.org/zh/installation.html webpack就是一个模块化的工具 安装 cnpm i vue-router -S

  8. vue npm,Git随笔

    下载模块: npm install <package-name>  --save-dev 上线: npm run build 基本使用流程:1. npm install vue-cli - ...

  9. jquery关于多个显示隐藏

    今天做了一个关于多个栏目的隐藏与显示,内容为初始化显示6个栏目,点击按钮显示所有的栏目,在次点击隐藏出现的栏目 <div class="ftlt_z_navigation acer&q ...

  10. jmeter md5加密请求参数

    实际的接口测试过程中,再发生http之前有可能需要对某些参数(或某几个参数的组合)进行md5加密 在jmeter中可通过两种方式来实现md5加密 beanshell实现md5加密 在org.apach ...