JAVA Scanner类的nextInt方法接收到非法输入问题
如下代码,用来求阶乘
try{}catch{}里对nextInt()方法进行了异常捕获
package task;
import java.util.InputMismatchException;
import java.util.Scanner;
public class task2 {public static void main(String[] args) {Scanner input=new Scanner(System.in);int num = 0;//while循环接受非负正整数的输入,直到输入正确,跳出循环。while(true){System.out.println("请输入一个非负正整数:");try{num=input.nextInt();if(num>0)//判断是否为非负正整数break;}catch(InputMismatchException e){//捕获输入异常System.out.println("输入异常:"+e.toString());}}//关闭文本输入程序,释放资源input.close();//调用求阶乘的静态方法,并将其结果输出在控制台System.out.println(num+"!="+fac(num));}
//求阶乘的方法public static long fac(int n){long f;if(n==1)f=1;elsef=n*fac(n-1);return f;}
}
但是,如果控制台输入错误,却一直循环输出:
请输入一个非负正整数:
a
请输入一个非负正整数:
输入异常:java.util.InputMismatchException
请输入一个非负正整数:
输入异常:java.util.InputMismatchException
请输入一个非负正整数:
输入异常:java.util.InputMismatchException
...........
原因是:nextInt()方法只能接受整型数据,如果输入非整型,就会有异常,就不会读取文本缓冲区的内容,文本缓冲区的内容就不会消失,即使下次再调用nextInt()方法,因为文本缓冲区的内容还是上次的内容,异常继续发生,依次循环。
解决办法:
在catch里加上个input.next();即可
Scanner类里的next()方法在jdk文档里:
String
next()
查找并返回此扫描仪的下一个完整标记。
因为next()方法可以接受字符串,调用此方法后,就会读取文本缓冲区的内容并以字符串返回,相当于把文本缓冲区清空了。
修改后代码:
package task;
import java.util.InputMismatchException;
import java.util.Scanner;
public class task2 {public static void main(String[] args) {Scanner input=new Scanner(System.in);int num = 0;//while循环接受非负正整数的输入,直到输入正确,跳出循环。while(true){System.out.println("请输入一个非负正整数:");try{num=input.nextInt();if(num>0)//判断是否为非负正整数break;}catch(InputMismatchException e){//捕获输入异常System.out.println("输入异常:"+e.toString());input.next();//读取下一个值}}//关闭文本输入程序,释放资源input.close();//调用求阶乘的静态方法,并将其结果输出在控制台System.out.println(num+"!="+fac(num));}
//求阶乘的方法public static long fac(int n){long f;if(n==1)f=1;elsef=n*fac(n-1);return f;}
}
如下图:
这时控制台输入错误,就不会陷入死循环了
![](/assets/blank.gif)
JAVA Scanner类的nextInt方法接收到非法输入问题相关推荐
- java scanner类 构造器,Java Scanner类
本文概述 Java的Scanner类可在java.util包中找到. Java提供了多种从键盘读取输入的方法, java.util.Scanner类就是其中之一. Java Scanner类使用默认为 ...
- JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
基本概念 Java通过系统类System实现标准输入/输出的功能 通过实例化Scanner类的方式实现从键盘的数据输入 问题描述 错误示例一: import java.util.Scanner;pub ...
- Java中Scanner类的close()方法所引发的错误
Java通过系统类System实现标准输入/输出的功能 我们经常通过实例化Scanner类的方式实现从键盘的数据输入 但其中的如果对其中一些细节不了解,就会引发不能理解的错误 比如close方法: i ...
- Java Scanner 类
Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Scann ...
- java scanner类成员_Java Scanner类的使用示例
1 Scanner的使用 JDK给我们提供了成千上万个类供我们直接使用,而Scanner就是这众多类里的一个最常用的一个类,既然它是一个类,我们使用它的方法和使用我们自己写的类的方法基本一致. 方法基 ...
- JAVA Scanner 类用法小结
JAVA Scanner 类用法小结 1.Scanner是java中的一个类,可使用这个类创建一个对象,进行输入操作. Scanner reader = new Scanner(System.in): ...
- Java Scanner类的详细介绍(Java键盘输入)
Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...
- Java Scanner类的介绍及使用
目录 1 什么是Scanner类 2 Scanner类的对象创建 1 查看类并导入类 2 查看构造方法 3 创建对象 3 Scanner类的基本方法 1 next() 方法 2 nextLine() ...
- Java Scanner类的常用方法及用法(很详细)
Java Scanner类的方法及用法(很详细) Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringToken ...
最新文章
- LeetCode简单题之三维形体的表面积
- HDU2594 KMP next数组的应用
- 时间序列、时间序列分析、时间序列效应分解、平稳时间序列、AIC和BIC
- php 降序 保留索引,PHP asort():对数组排序(升序),并保持索引关系
- 从FTP建立连接模式想到的TCP SYNFlood防御
- SpringMVC 实现注册登录
- 最长不重复子串—leetcode3
- MediaPlayer使用方法简单介绍
- C++ STL string字符串替换 replace函数的使用
- 省选专练[USACO18JAN]Stamp Painting
- 51nod 1577 线性基
- banner图/轮播图----html
- matlab切片操作
- excel技巧——F9键
- 数据架构建设方法及案例
- 自己动手写三层代码生成器学习总结
- 深度解析FUTABA的SBUS协议(/天地飞遥控器的WBUS协议/Robomaster接收机的DBUS协议)到底是啥?
- 简述计算机构位移的目的,简述应变片的选用原则
- js犀牛书,学习心得笔记(一)
- MQTT之emqx使用问题:EMQX Node 'emqx@127.0.0.1' not responding to pings.
热门文章
- 林德康:从搜索引擎到问答引擎再到动作引擎
- 微信小程序+nginx+php+mysql实现数据库管理【第二期】小程序端的操作
- postgresql入门_PostgreSQL入门
- Edge浏览器:“STATUS_INVALID_IMAGE_HASH“错误状态码解决办法
- Linux设置ssh免密登录
- [附源码]JSP+ssm计算机毕业设计房产中介管理系统j32r6【源码、数据库、LW、部署】
- 【MATLAB】【公式验证】泰勒级数
- python分析基金_【教妹子买基金-01】用python分析基金成分股
- os.listdir(相对路径)
- 中通快递数据治理实践