java(安全方便的从控制台读入数据)[对Scanner类进行封装,用正则表达式判断]

本文介绍了一种通过正则表达式验证,在控制台安全读取整数、浮点数及字符串的方法。该方法能有效避免非法输入导致的程序异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此版本是对自己的这篇博客中的源码进行了优化:http://blog.youkuaiyun.com/haifengzhilian/article/details/7835404


  1. package com.iflytek.util;  
  2. import java.util.*;  
  3. import java.util.regex.Pattern;  
  4.   
  5. /** 
  6.  * 类名:GetSafeInput 
  7.  * 作用:在控制台中安全的读入一个数值 ------ 整型或浮点型 
  8.  *  
  9.  * 方法: 
  10.  * 1,用 try ... catch ... (会损失效率,最好不要用) 
  11.  * 2,用正则表达式  
  12.  *  
  13.  * 方法2--说明: 
  14.  * 阻塞的方式,用Scanner从控制台安全的读入一个数 
  15.  *  
  16.  * 创建时间:2012-8-6 15:20 
  17.  *  
  18.  * 修改时间:2012-8-6 16:31  
  19.  *          说明: 添加:public static int getInt() 
  20.  *                  添加:public static int getDouble() 
  21.  *                  其他BUG修正 
  22.  *          2012-8-14 19:21 
  23.  *          说明: 添加 getString()方法; 
  24.  *                  将类名由GetSafeNumber改为GetSafeInput 
  25.  *          2012-8-27 12:32 
  26.  *          说明: 对正则表达式进行修改,去除负号的异常错误 
  27.  *  
  28.  *  
  29.  * @author 常维军 
  30.  * 
  31.  */  
  32. public class GetSafeInput  
  33. {  
  34.     /** 
  35.      * 阻塞式的从控制台读入一个安全的整数 
  36.      * 说明:显式使用Scanner对象 
  37.      * @param sc Scanner对象 
  38.      * @return 如果是整数则返回,如果不是整数继续读取,知道读入一个整数结束 
  39.      */  
  40.     public static int getInt(Scanner sc)  
  41.     {  
  42.         String inputs = sc.next();  
  43.   
  44.         while(!isInteger(inputs)) {  
  45.             System.out.println("格式不正确,请重新输入");  
  46.             inputs = sc.next();  
  47.         }  
  48.           
  49.         return Integer.valueOf(inputs);  
  50.     }  
  51.       
  52.     /** 
  53.      * 阻塞式的从控制台读入一个安全的整数 
  54.      * 说明:隐式使用Scanner对象 
  55.      * @return 如果是整数则返回,如果不是整数继续读取,知道读入一个整数结束 
  56.      */  
  57.     public static int getInt()  
  58.     {  
  59.         Scanner sc = new Scanner(System.in);  
  60.         String inputs = sc.next();  
  61.   
  62.         while(!isInteger(inputs)) {  
  63.             System.out.println("格式不正确,请重新输入");  
  64.             inputs = sc.next();  
  65.         }  
  66.           
  67.         return Integer.valueOf(inputs);  
  68.     }  
  69.       
  70.     /** 
  71.      * 阻塞式的从控制台读入一个安全的浮点数 
  72.      * 说明:显式使用Scanner对象 
  73.      * @param sc Scanner对象 
  74.      * @return 如果是浮点数则返回,如果不是浮点数继续读取,知道读入一个正确的浮点数结束 
  75.      */  
  76.     public static double getDouble(Scanner sc)  
  77.     {  
  78.         String inputs = sc.next();  
  79.   
  80.         while(!isDouble(inputs)) {  
  81.             System.out.println("格式不正确,请重新输入");  
  82.             inputs = sc.next();  
  83.         }  
  84.           
  85.         return Double.valueOf(inputs);  
  86.     }  
  87.       
  88.     /** 
  89.      * 阻塞式的从控制台读入一个安全的浮点数 
  90.      * 说明:隐式使用Scanner对象 
  91.      * @return 如果是浮点数则返回,如果不是浮点数继续读取,知道读入一个正确的浮点数结束 
  92.      */  
  93.     public static double getDouble()  
  94.     {  
  95.         Scanner sc = new Scanner(System.in);  
  96.         String inputs = sc.next();  
  97.   
  98.         while(!isDouble(inputs)) {  
  99.             System.out.println("格式不正确,请重新输入");  
  100.             inputs = sc.next();  
  101.         }  
  102.           
  103.         return Double.valueOf(inputs);  
  104.     }  
  105.       
  106.     /** 
  107.      * 判断是否是浮点数 
  108.      * 方法:利用正则表达式 
  109.      * @param s 需要判断的字符串 
  110.      * @return 是浮点数返回真,否则返回假 
  111.      */  
  112.     public static boolean isDouble(String s){  
  113.         Pattern pattern = Pattern.compile("(\\-?)[0-9]+(\\.?)[0-9]*");  
  114.         if(pattern.matcher(s).matches()) {  
  115.             return true;  
  116.         }  
  117.         return false;  
  118.     }  
  119.       
  120.     /** 
  121.      * 判断是否是整数 
  122.      * 方法:利用正则表达式 
  123.      * @param s 需要判断的字符串 
  124.      * @return 是整数返回真,否则返回假 
  125.      */  
  126.     public static boolean isInteger(String s){  
  127.         Pattern pattern = Pattern.compile("(\\-?)[0-9]+");  
  128.         if(pattern.matcher(s).matches()) {  
  129.             return true;  
  130.         }  
  131.         return false;  
  132.     }  
  133.       
  134.     /** 
  135.      * 隐式使用Scanner对象,从控制台读入字符 
  136.      * 添加日期:2012-8-14 
  137.      * @return 从控制台获取的字符 
  138.      */  
  139.     public static String getString() {  
  140.         String inputString = null;  
  141.         Scanner scanner = new Scanner(System.in);  
  142.         inputString = scanner.next();  
  143.         return inputString;  
  144.     }  
  145.       
  146.     /** 
  147.      * 显式使用Scanner对象,从控制台读入字符 
  148.      * 添加日期:2012-8-14 
  149.      * @return 从控制台获取的字符 
  150.      */  
  151.     public static String getString(Scanner sc) {  
  152.         String inputString = null;  
  153.           
  154.         inputString = sc.next();  
  155.         return inputString;  
  156.     }  

  1. }  




转载来自:http://blog.youkuaiyun.com/haifengzhilian/article/details/7867462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值