在编程过程中,很多技术人员看重程序的简洁性,效率性和包容性。其中最容易问到的就是假如输入数据不符合要求时的程序处理,这也是很多公司的机试题中应聘人员写出了符合功能要求的程序却并未通过面试的原因。下面是本人在刷《剑指offer》的过程中遇到的第一个问题,java中使用Scanner进行输入时,关于判定用户输入数据是否符合数据类型要求的处理的问题。
比如编程题中要求程序判定用户输入的数是否为水仙花数。
题意中虽然并没有特意说明数据类型,通常我们会采用int型变量作为程序中的主要参数,很多程序员在面试过程中拿到题目便不假思索,洋洋洒洒的写出了简洁高效的代码,但是最后却被通知机试不通过。有可能就是面试官希望在程序中看到关于异常情况的处理,但是程序员提交的答案却完全没有考虑到这点。
我在刚接触输入验证的过程中看到网友介绍了很多方法,筛选过后认为一下方法是最适合初学者的。
假如已知程序中定义的基本数据类型为int型,需要写出输入验证的处理过程是“当用户输入非整数的时候便一直提醒用户输入整数,直到正确输入再进行后续操作”。
于是我在一开始写下的代码如下:
1 import java.util.Scanner; 2 3 public class test { 4 public static void main(String[] args){ 5 Scanner sc=new Scanner(System.in); 6 int num; 7 while(true){ 8 if (sc.hasNextInt()){ 9 num=sc.nextInt(); 10 break; 11 }else{ 12 System.out.println("输入错误,请重新输入整数:"); 13 } 14 } 15 } 16 }
该代码的思路是在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); } }