使用java.util.Scannervalidationinput
我正在使用java.util.Scanner
从System.in
获取用户input。 我需要validationinput的东西,如:
- 它必须是一个非负数
- 它必须是一个字母的字母
- …等
什么是最好的方法来做到这一点?
Scanner.hasNextXXX
方法的概述
java.util.Scanner
有许多hasNextXXX
方法可用于validationinput。 以下是对它们的简要介绍:
-
hasNext()
– 它是否有任何令牌? -
hasNextLine()
– 是否有另一行input? - 对于Java原语
-
hasNextInt()
– 它有一个可以parsing成int
的标记吗? -
hasNextDouble()
,hasNextFloat()
,hasNextByte()
,hasNextShort()
,hasNextLong()
和hasNextBoolean()
- 作为奖励,还有
hasNextBigInteger()
和hasNextBigDecimal()
- 整数types也有重载指定基数(例如hex)
-
- 基于正则expression式
-
hasNext(String pattern)
-
hasNext(Pattern pattern)
是Pattern.compile
重载
-
Scanner
是能够更多,由于它是基于正则expression式的事实。 一个重要的特性是useDelimiter(String pattern)
,它可以让你定义什么样的模式分隔你的标记。 还有一些忽略分隔符的find
和skip
方法。
下面的讨论将保持正则expression式尽可能简单,所以重点仍然放在Scanner
。
示例1:validation正整数
下面是使用hasNextInt()
从inputvalidation正int
的简单示例。
Scanner sc = new Scanner(System.in); int number; do { System.out.println("Please enter a positive number!"); while (!sc.hasNextInt()) { System.out.println("That's not a number!"); sc.next(); // this is important! } number = sc.nextInt(); } while (number <= 0); System.out.println("Thank you! Got " + number);
以下是一个示例会话:
请input正数!
五
这不是一个数字!
-3
请input正数!
五
谢谢! 得到了5
注意与更详细的try/catch
Integer.parseInt
/ NumberFormatException
组合相比, Scanner.hasNextInt()
更容易使用。 通过契约,一个Scanner
保证 ,如果它有hasNextInt()
,那么nextInt()
将和平地给你那个int
,并且不会抛出任何的NumberFormatException
/ InputMismatchException
/ NoSuchElementException
。
相关问题
- 如何使用扫描器只接受有效的int作为input
- 如何防止扫描器在input错误types时抛出exception? (Java)的
示例2:在同一个标记中多个hasNextXXX
请注意,上面的代码片段包含一个sc.next()
语句,用于使Scanner
前进,直到它具有hasNextInt()
。 意识到hasNextXXX
方法 没有 任何一个input hasNextXXX
Scanner
是很重要的! 你会发现,如果你从代码片段中忽略了这一行,那么它会在无效input中进入无限循环!
这有两个后果:
- 如果您需要跳过
hasNextXXX
testing失败的“垃圾”input,则需要以某种方式提前Scanner
(例如next()
,nextLine()
,skip
等)。 - 如果一个人有
hasNextXXX
testing失败,你仍然可以testing它是否可能有hasNextYYY
!
以下是执行多个hasNextXXX
testing的示例。
Scanner sc = new Scanner(System.in); while (!sc.hasNext("exit")) { System.out.println( sc.hasNextInt() ? "(int) " + sc.nextInt() : sc.hasNextLong() ? "(long) " + sc.nextLong() : sc.hasNextDouble() ? "(double) " + sc.nextDouble() : sc.hasNextBoolean() ? "(boolean) " + sc.nextBoolean() : "(String) " + sc.next() ); }
以下是一个示例会话:
五
(int)5
假
(boolean)false
胡说
(string)等等
1.1
(双)1.1
千亿
(长)1000亿
出口
请注意,testing的顺序很重要。 如果Scanner
hasNextInt()
,那么它也有hasNextLong()
,但是hasNextLong()
不一定是true
的。 在更一般的testing之前,你往往会想做更具体的testing。
例3:validation元音
Scanner
具有正则expression式支持的许多高级function。 这里有一个使用它来validation元音的例子。
Scanner sc = new Scanner(System.in); System.out.println("Please enter a vowel, lowercase!"); while (!sc.hasNext("[aeiou]")) { System.out.println("That's not a vowel!"); sc.next(); } String vowel = sc.next(); System.out.println("Thank you! Got " + vowel);
以下是一个示例会话:
请input一个元音,小写!
五
那不是元音!
ž
那不是元音!
Ë
谢谢! 有e
在正则expression式中,作为一个Javastring,模式"[aeiou]"
就是所谓的“字符类”。 它匹配任何字母a
, e
, i
, o
, u
。 请注意,使上述testing不区分大小写是微不足道的:只要将这样的正则expression式提供给Scanner
。
API链接
-
hasNext(String pattern)
– 如果下一个标记匹配从指定string构造的模式,则返回true
。 -
java.util.regex.Pattern
相关问题
- 用Java读取单个字符
参考
- Java教程/基本类/正则expression式
- regular-expressions.info/Character Classes
例4:一次使用两台Scanner
有时候你需要一行一行地扫描,一行上有多个标记。 最简单的方法是使用两台 Scanner
,第二台Scanner
将第一台Scanner
的nextLine()
作为input。 这是一个例子:
Scanner sc = new Scanner(System.in); System.out.println("Give me a bunch of numbers in a line (or 'exit')"); while (!sc.hasNext("exit")) { Scanner lineSc = new Scanner(sc.nextLine()); int sum = 0; while (lineSc.hasNextInt()) { sum += lineSc.nextInt(); } System.out.println("Sum is " + sum); }
以下是一个示例会话:
给我一串数字(或“退出”)
3 4 5
总和是12
10亿美元
总和是110
等什么?
总和为0
出口
除了Scanner(String)
构造函数外,还有Scanner(java.io.File)
等等。
概要
-
Scanner
提供了丰富的function,如hasNextXXX
validation方法。 - 正确使用
hasNextXXX/nextXXX
意味着Scanner
永远不会抛出InputMismatchException
/NoSuchElementException
。 - 务必记住,
hasNextXXX
不会使Scanner
超过任何input。 - 如果有必要,不要害羞地创build多个
Scanner
。 两个简单的Scanner
往往比一个过于复杂的Scanner
更好。 - 最后,即使您没有计划使用高级正则expression式function,请记住哪些方法是基于正则expression式的,哪些不是。 任何采用
String pattern
参数的Scanner
方法都是基于regex的。- 提示 :将任何
String
转换为文字模式的简单方法是Pattern.quote
。
- 提示 :将任何
为了检查string的字母,你可以使用正则expression式,例如:
someString.matches("[AF]");
为了检查数字和停止程序崩溃,我有一个非常简单的类,你可以在下面find你可以定义你想要的值的范围。 这里
public int readInt(String prompt, int min, int max) { Scanner scan = new Scanner(System.in); int number = 0; //Run once and loop until the input is within the specified range. do { //Print users message. System.out.printf("\n%s > ", prompt); //Prevent string input crashing the program. while (!scan.hasNextInt()) { System.out.printf("Input doesn't match specifications. Try again."); System.out.printf("\n%s > ", prompt); scan.next(); } //Set the number. number = scan.nextInt(); //If the number is outside range print an error message. if (number < min || number > max) System.out.printf("Input doesn't match specifications. Try again."); } while (number < min || number > max); return number; }
这是一个简单的方法来做到这一点。
System.out.print("Please enter an integer: "); while(!scan.hasNextInt()) scan.next(); int demoInt = scan.nextInt();
一个想法:
try { int i = Integer.parseInt(myString); if (i < 0) { // Error, negative input } } catch (NumberFormatException e) { // Error, not a number. }
在commons-lang库中, 还有一个CharUtils类,它提供方法isAsciiNumeric()
来检查一个字符是一个数字,而isAsciiAlpha()
来检查这个字符是一个字母。
如果您是从控制台或类似的parsingstring数据,最好的方法是使用正则expression式。 在这里阅读更多: http : //java.sun.com/developer/technicalArticles/releases/1.4regex/
否则,要从一个stringparsing一个int,请尝试Integer.parseInt(string) 。 如果string不是一个数字,你会得到一个exception。 另外,你可以对这个值进行检查,以确保它不是负面的。
String input; int number; try { number = Integer.parseInt(input); if(number > 0) { System.out.println("You positive number is " + number); } } catch (NumberFormatException ex) { System.out.println("That is not a positive number!"); }
为了得到一个只有字符的string,你可能会更好地循环每个字符检查数字,例如使用Character.isLetter(char) 。
String input for(int i = 0; i<input.length(); i++) { if(!Character.isLetter(input.charAt(i))) { System.out.println("This string does not contain only letters!"); break; } }
祝你好运!
我所尝试的是,首先我拿了整数input,并检查是否是否定的,如果它的负面再次采取input
Scanner s=new Scanner(System.in); int a=s.nextInt(); while(a<0) { System.out.println("please provide non negative integer input "); a=s.nextInt(); } System.out.println("the non negative integer input is "+a);
在这里,您需要先input字符,然后检查用户是否input字符,如果不是,再input字符
char ch = s.findInLine(".").charAt(0); while(!Charcter.isLetter(ch)) { System.out.println("please provide a character input "); ch=s.findInLine(".").charAt(0); } System.out.println("the character input is "+ch);