黑马程序员技术交流社区

标题: 如何对scanner对象输入的数据进行判断 [打印本页]

作者: yanghao    时间: 2014-9-25 11:14
标题: 如何对scanner对象输入的数据进行判断
本帖最后由 yanghao 于 2014-9-25 14:10 编辑

建立了一个scanner对象,从键盘输入数据,怎样判断该数据是不是数字,而不是abc%*等非数字内容呢    如果输入了abc等非数字,就提醒
用户不要输入非数字,继续输入数字。但是我下面写的代码感觉无法做这样的判断,因为比如我输入abc,按下回车键后,程序立马就抛出异常并
停止了,怎么才能让程序不停止,用户还可以继续输入呢
  1. import java.util.Arrays;
  2. import java.util.Scanner;


  3. public class T {

  4.         public static void main(String[] args) {
  5.                
  6.                 System.out.println("请输入五个数字,每输入一个数字按回车键以输入下一个数字。不要输入非数字,否则程序会抛出异常并停止");
  7.                 Scanner s = new Scanner(System.in);
  8.                 int[] a = new int[5];
  9.                
  10.                  
  11.                 for (int i = 0; i < a.length; i++) {
  12.                         
  13.                         a[i] = s.nextInt();
  14.                         
  15.                 }
  16.                 s.close();
  17.                 Arrays.sort(a);
  18.                 System.out.println("最小值是: "+a[0]);
  19.                 System.out.println("最大值是: "+a[a.length-1]);

  20.         
  21.         }

  22.         

  23. }
复制代码

作者: yanghao    时间: 2014-9-25 11:16
有没有哪位可以解答啊
作者: 天邃任我桓    时间: 2014-9-25 11:45
用正则表达式
作者: java_dream    时间: 2014-9-25 12:16
看代码:
  1. package com.test;

  2. import java.util.Scanner;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;

  5. public class Test {
  6.        
  7.         public static void main(String[] args) {
  8.                         String input = null;
  9.                         // 判断用户输入的内容是否为数字","默认不是数字
  10.                         boolean isNum = false;
  11.                         // 不断获取用户输入的内容,并判断是否是数字
  12.                         while (true) {
  13.                                 //获取用户输入的内容
  14.                                 input = getInput();
  15.                                 // 匹配输入的内容是数字的正则表达式
  16.                                 Pattern pattern = Pattern.compile("[0-9]{1,19}");
  17.                                 Matcher matcher = pattern.matcher(input);
  18.                                
  19.                                 //如果匹配就是数字,否则不是数字
  20.                                 if(matcher.matches()){
  21.                                         System.out.println("是数字\n");
  22.                                 }else{
  23.                                         System.out.println("非数字\n");
  24.                                 }
  25.                         }
  26.         }

  27.         // 该方法用于获取用户输入的内容
  28.         public static String getInput() {
  29.                 Scanner in = new Scanner(System.in);
  30.                 String num = "";
  31.                 // 如果用户输入为空,继续让用户输入
  32.                 while (num.equals("")) {
  33.                         System.out.printf("请输入阿拉伯数字:");
  34.                         num = in.nextLine();
  35.                 }
  36.                 return num;
  37.         }

  38. }
复制代码

作者: yanghao    时间: 2014-9-25 14:08
喔,非常感谢楼上细心的回复,不过楼上的思路就是每输入一次就新建一个scanner对象,这样会不会占用太多内存呢?可不可以只用一个scanner对象实现呢  
作者: yueyazhishang    时间: 2014-9-25 14:46
我的方法应该解决了你的问题。
  1. public void myTest()
  2.         {
  3.                 Scanner sc=new Scanner(System.in);
  4.                 int a[]=new int[5];
  5.                 String temp="";//接受输入任何内容
  6.                 int i=0;
  7.                 out://当有异常,也就是输入的不是数字时要从这里开始执行
  8.                 while(i<a.length)
  9.                 {
  10.                         temp=sc.next();
  11.                         try{
  12.                         a[i]=Integer.parseInt(temp);
  13.                         }
  14.                         catch (Exception e) {
  15.                                 continue out;
  16.                         }
  17.                         i++;
  18.                 }
  19.                 Arrays.sort(a);
  20.                 System.out.println("最小值:"+a[0]);
  21.                 System.out.println("最大值:"+a[a.length-1]);
  22.         }
复制代码

作者: java_dream    时间: 2014-9-25 17:42
yanghao 发表于 2014-9-25 14:08
喔,非常感谢楼上细心的回复,不过楼上的思路就是每输入一次就新建一个scanner对象,这样会不会占用太多内 ...

当然是可以的,需求不同类的设计也是不一样的,如果紧把Test当成获取的键盘录入内容只能是数字,可以把getInput()方法中的
  1. Scanner in = new Scanner(System.in);
复制代码

写成类的成员变量,即写到方法体外面去:
  1. static Scanner in = new Scanner(System.in);
复制代码

作者: 杜工    时间: 2014-10-2 06:55
黑马牛人还是很多的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2