如下代码,用来求阶乘

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;}
}

如下图:

这时控制台输入错误,就不会陷入死循环了

运行截图

JAVA Scanner类的nextInt方法接收到非法输入问题相关推荐

  1. java scanner类 构造器,Java Scanner类

    本文概述 Java的Scanner类可在java.util包中找到. Java提供了多种从键盘读取输入的方法, java.util.Scanner类就是其中之一. Java Scanner类使用默认为 ...

  2. JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案

    基本概念 Java通过系统类System实现标准输入/输出的功能 通过实例化Scanner类的方式实现从键盘的数据输入 问题描述 错误示例一: import java.util.Scanner;pub ...

  3. Java中Scanner类的close()方法所引发的错误

    Java通过系统类System实现标准输入/输出的功能 我们经常通过实例化Scanner类的方式实现从键盘的数据输入 但其中的如果对其中一些细节不了解,就会引发不能理解的错误 比如close方法: i ...

  4. Java Scanner 类

    Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Scann ...

  5. java scanner类成员_Java Scanner类的使用示例

    1 Scanner的使用 JDK给我们提供了成千上万个类供我们直接使用,而Scanner就是这众多类里的一个最常用的一个类,既然它是一个类,我们使用它的方法和使用我们自己写的类的方法基本一致. 方法基 ...

  6. JAVA Scanner 类用法小结

    JAVA Scanner 类用法小结 1.Scanner是java中的一个类,可使用这个类创建一个对象,进行输入操作. Scanner reader = new Scanner(System.in): ...

  7. Java Scanner类的详细介绍(Java键盘输入)

    Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...

  8. Java Scanner类的介绍及使用

    目录 1 什么是Scanner类 2 Scanner类的对象创建 1 查看类并导入类 2 查看构造方法 3 创建对象 3 Scanner类的基本方法 1 next() 方法 2 nextLine() ...

  9. Java Scanner类的常用方法及用法(很详细)

    Java Scanner类的方法及用法(很详细) Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringToken ...

最新文章

  1. LeetCode简单题之三维形体的表面积
  2. HDU2594 KMP next数组的应用
  3. 时间序列、时间序列分析、时间序列效应分解、平稳时间序列、AIC和BIC
  4. php 降序 保留索引,PHP asort():对数组排序(升序),并保持索引关系
  5. 从FTP建立连接模式想到的TCP SYNFlood防御
  6. SpringMVC 实现注册登录
  7. 最长不重复子串—leetcode3
  8. MediaPlayer使用方法简单介绍
  9. C++ STL string字符串替换 replace函数的使用
  10. 省选专练[USACO18JAN]Stamp Painting
  11. 51nod 1577 线性基
  12. banner图/轮播图----html
  13. matlab切片操作
  14. excel技巧——F9键
  15. 数据架构建设方法及案例
  16. 自己动手写三层代码生成器学习总结
  17. 深度解析FUTABA的SBUS协议(/天地飞遥控器的WBUS协议/Robomaster接收机的DBUS协议)到底是啥?
  18. 简述计算机构位移的目的,简述应变片的选用原则
  19. js犀牛书,学习心得笔记(一)
  20. MQTT之emqx使用问题:EMQX Node 'emqx@127.0.0.1' not responding to pings.

热门文章

  1. 林德康:从搜索引擎到问答引擎再到动作引擎
  2. 微信小程序+nginx+php+mysql实现数据库管理【第二期】小程序端的操作
  3. postgresql入门_PostgreSQL入门
  4. Edge浏览器:“STATUS_INVALID_IMAGE_HASH“错误状态码解决办法
  5. Linux设置ssh免密登录
  6. [附源码]JSP+ssm计算机毕业设计房产中介管理系统j32r6【源码、数据库、LW、部署】
  7. 【MATLAB】【公式验证】泰勒级数
  8. python分析基金_【教妹子买基金-01】用python分析基金成分股
  9. os.listdir(相对路径)
  10. 中通快递数据治理实践