使用java.util.Scannervalidationinput

我正在使用java.util.ScannerSystem.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) ,它可以让你定义什么样的模式分隔你的标记。 还有一些忽略分隔符的findskip方法。

下面的讨论将保持正则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中进入无限循环!

这有两个后果:

  • 如果您需要跳过hasNextXXXtesting失败的“垃圾”input,则需要以某种方式提前Scanner (例如next()nextLine()skip等)。
  • 如果一个人有hasNextXXXtesting失败,你仍然可以testing它是否可能有hasNextYYY

以下是执行多个hasNextXXXtesting的示例。

 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]"就是所谓的“字符类”。 它匹配任何字母aeiou 。 请注意,使上述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将第一台ScannernextLine()作为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,如hasNextXXXvalidation方法。
  • 正确使用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);