在编程过程中,很多技术人员看重程序的简洁性,效率性和包容性。其中最容易问到的就是假如输入数据不符合要求时的程序处理,这也是很多公司的机试题中应聘人员写出了符合功能要求的程序却并未通过面试的原因。下面是本人在刷《剑指offer》的过程中遇到的第一个问题,java中使用Scanner进行输入时,关于判定用户输入数据是否符合数据类型要求的处理的问题。

比如编程题中要求程序判定用户输入的数是否为水仙花数。

题意中虽然并没有特意说明数据类型,通常我们会采用int型变量作为程序中的主要参数,很多程序员在面试过程中拿到题目便不假思索,洋洋洒洒的写出了简洁高效的代码,但是最后却被通知机试不通过。有可能就是面试官希望在程序中看到关于异常情况的处理,但是程序员提交的答案却完全没有考虑到这点。

我在刚接触输入验证的过程中看到网友介绍了很多方法,筛选过后认为一下方法是最适合初学者的。

假如已知程序中定义的基本数据类型为int型,需要写出输入验证的处理过程是“当用户输入非整数的时候便一直提醒用户输入整数,直到正确输入再进行后续操作”。

于是我在一开始写下的代码如下:

 import java.util.Scanner;

 public class test {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int num;
while(true){
if (sc.hasNextInt()){
num=sc.nextInt();
break;
}else{
System.out.println("输入错误,请重新输入整数:");
}
}
}
}

该代码的思路是在while循环里用if判断输入的是否为整数,如果是整数则将该值赋值给num,跳出循环,如果不是整数则打印“输入错误,请重新输入整数:”,实际上,因为while循环的判定语句是true,始终成立,所以while循环体内的语句会无限循环,所以一旦接收到非整数的输入,则会无限打印上面的提示文字。

该代码中需要改正的问题就是要将hasNextInt()的判定放在while循环的判定中,只有输入为整数的时候循环才会结束,并且因为hasNexInt()判定完输入的数据后并不会将标记移动到下一行,所以循环的过程中并不会再次判断输入的数据是否为整数,只会继续往后执行打印提示文字的语句。想要把标记移动到下一行重新判断用户再次输入的数据是否符合要求需要用next(),改进后的代码如下:

import java.util.Scanner;

public class test {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int num;
while(!sc.hasNextInt()){
sc.next();
System.out.println("输入错误,请重新输入整数:");
}
num=sc.nextInt();
System.out.println("你输入的是:"+num);
}
}

Java中输入判定的错误和纠正的更多相关文章

  1. 深入探讨Java中的异常与错误处理

    Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...

  2. 记一次在java中的日期parse错误

    String dateString = "2014101517"; new SimpleDateFormat("yyyyMMddHH").parse(dateS ...

  3. 简单聊聊java中如何判定一个对象可回收

    背景 说到java的特性,其中一个最重要的特性便是java通过new在堆中分配给对象的内存,不需要程序员主动去释放,而是由java虚拟机自动的回收.这也是java和C++的主要区别之一:那么虚拟机是如 ...

  4. Java中的一些常见错误

    1.空指针错误 在java数组的使用中,有时候需要对字符串数组中的元素进行对比.那么当元素不为null时,程序会正常运行:然而,一旦对比的元素为null,那么程序就会出现空指针错误. 解决方法:加入保 ...

  5. java中输入方式Scanner和BufferedReader

    Scanner 在java.util包中,需要引入时可以用import java.util.*;或者import java.util.Scanner; 工作原理:通过new创建一个Scanner对象, ...

  6. Java中输入字符的排列以及按从小到大的顺序输出

    今天笔试,遇到一个问题,大意就是输入一行字符,例如a b c ,按从小到大的顺序输出它们排列而成的字符串,输出就是abc acb bac bca cba cab.求这个程序怎么实现. 其实这个题很简单 ...

  7. java中数组实现的错误

    作为一个刚学java的小白 真是错误百出 下面就是一个大神会非常不屑的一个小错误 数组在初始化的时候仅仅是定义了一个数组,并未其中的内容初始化. 附上错误代码 : class student{publ ...

  8. java 中常见的一些错误

    1.NosuchMethodError java 类中找不到该方法! 可能该类所在的同一个包下有一个相同的相同的类,然后那个类中没有我们所要调用的类. 解决方法:若那个类不需要,可以删除class! ...

  9. java中输入3个数,从大到小的输出。。。。

    总结:我暂时不能理解,C语言时讲过,java里就不理解了 package com.a; import java.sql.Date; import java.util.Scanner; //输入三个数, ...

随机推荐

  1. linux系统安装redis

    redis的下载安装教程 1.进入到linux指定目录中 cd /usr/local        路径看你自己情况 2.下载redis,执行如下命令: wget http://download.re ...

  2. C Programming Style 总结

    对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...

  3. mysql常用权限命令、乱码及其他问题记录

    用户管理 use mysql; 查看   select host,user,password from user ; 创建 create user  xuhong IDENTIFIED by 'xuh ...

  4. Basic GC Tuning

    Sizing the Heap -XmsN -XmxN Summary The JVM will attempt to find a reasonable minimum and maximum he ...

  5. docker完整配置nginx+php+mysql

    首先了解一个方法: 使用docker exec进入Docker容器 docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用: s ...

  6. maven 使用 log4j

    Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可 ...

  7. macOS Mojave待机耗电大

    这很有可能是待机时依然链接网络导致的.如果不需要待机时链接网络可以执行 sudo pmset -a tcpkeepalive 0 恢复则执行 sudo pmset -a tcpkeepalive 1

  8. django系列3 :创建模型

    1创建模型 在我们简单的民意调查应用程序中,我们将创建两个模型:Question和Choice.A Question有问题和出版日期.A Choice有两个字段:选择的文本和投票记录.每个Choice ...

  9. Vue(基础八)_导航守卫(组件内的守卫)

    一.前言 主要通过一个例子演示三个钩子的作用: 1.beforeRouteEnter()                                                         ...

  10. redis-sentinel高可用配置(2)

    一:说明 前面我们已经配置了redis的主从配置(链接),这种主从架构有一个问题,当主master出现了故障了,怎么切换到从服务器上呢? 第一种:手动切换, 这种肯定会造成比较长一段时间的用户不能访问 ...