使用java扫描程序在获取用户输入时检查两个条件

时间:2016-07-13 15:28:00

标签: java while-loop java.util.scanner

我需要用户输入1到301之间的int。 我在这里有一个简单的循环来检查用户输入。 我只想要一个来自用户的号码,如果用户输入任何而不是1到301之间的int,我想显示打印行并提示用户再次尝试,直到他们输入有效的输入。

        while (!sc.hasNextInt()) {
            System.out.print("Invalid Input. Please enter a valid number between 1 and 301: ");
            sc.next();
        }
        int numToCheck = sc.nextInt();
        // do stuff with numToCheck

这检查输入是否为int,但我似乎找不到给int输入绑定的方法。我试图将用户输入分配给变量,然后检查条件输入< 1或输入> 301,但如果用户输入一个字母,我会得到InputMismatchException。我该如何存储用户输入? (我想将它存储为int以检查条件,但不能这样做,因为我不知道用户将输入什么)。

也许有更好的设计来实现这一切。这些也受到欢迎。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您没有保存输入的值。因此,每当程序看到"sc.nextInt()"将输入分配给变量时,您的程序就会等待用户输入一个数字,然后检查条件。 编辑:好的,我会为你加倍努力。看看是否有效。

***适用于用户可能输入字符而非数字的情况。

import java.util.*;
public class HelloWorld{

public static void main(String []args){
    Scanner sc = new Scanner(System.in);
    int input;
    while (true){
        if (sc.hasNextInt()){
             input = sc.nextInt(); // Assign the next integer to a variable
             if (input  <= 301  && input >= 1){ // Check if integer meets condition
                   break; // Condition met, break out of loop
            }
        }else{
              sc.next();
        }
        System.out.println("Invalid Input. Please enter a valid number between 1 and 301: ");
    }
}

}

答案 1 :(得分:0)

假设您只想要来自用户的1个输入,请尝试使用简单代码,该代码接受用户输入,直到用户输入有效输入。

IEnumerable<XElement> locationNodes = doc.Document.Descendants().Where(x => x.Name.LocalName == "location").ToList();

foreach (XElement e in locationNodes)
{
    Location location = new Location()
    {
        Name = e.Attribute("path").Value
    };

    if (location.Name == "Default Web Site")
    {
        //not working
        IEnumerable<XElement> httpLogging = e.Elements().Where(x => x.Name.LocalName == "httpLogging").ToList();
        //need to obtain the value of 'dontLog' attribute and return null if not exist
    }
}

public class Location
{
    public string Name { get; set; }
}

如果您希望用户输入多于1个输入(即此处为3),则设置一个随用户的每个有效输入而增加的计数器,如下所示:

Scanner in = new Scanner(System.in);
     int flag = 0,x=0;
     while(flag == 0){
         x = in.nextInt();
         if(x<1 || x>301){
             flag = 0;
             System.out.println("Invalid Input.");
         }
         else{
             flag = 1;
         }
     }

修改

如果您还想检查输入是否为 Scanner in = new Scanner(System.in); int flag = 0,x=0,count = 1; while(flag == 0){ x = in.nextInt(); if(x<1 || x>301){ flag = 0; System.out.println("Invalid Input."); } else{ //executes when input is valid if(count == 3){ flag = 1; } count++; } } ,则必须在上面的代码中添加一个额外条件。正如您所说,您只需要来自用户而不是Integer的一个输入,您必须更改退出条件。更改代码如下:

3

我们将输入视为Scanner in = new Scanner(System.in); int flag = 0,count = 1,x=0,flag1 = 0; String y; while(flag == 0){ y = in.next(); flag1 = 0; try{ x = Integer.parseInt(y); } catch(NumberFormatException e){ flag1 = 1; System.out.println("Invalid Input."); } if((x<1 || x>301)&&flag1 == 0){ flag = 0; System.out.println("Invalid Input."); } else if(flag1 == 0){ //executes when input is valid if(count == 1){ // put count == 3 if you want 3 inputs from user. flag = 1; } count++; } } ,然后使用StringString转换为Integer。如果Integer.parseInt()不是String,那么它将抛出异常,我们将继续循环,直到用户输入有效输入。

答案 2 :(得分:0)

我运行了这段代码,看它是否会显示出比你更好的性能。

Scanner sc = new Scanner(System.in);

boolean valid = true;
do {
    if (!valid) {
        System.out.print("Invalid Input. ");
    }
    System.out.print("Please enter a valid number between 1 and 301: ");
    String input = sc.next();
    try {
        int value = Integer.parseInt(input);
        valid = (value >= 1 && value <= 301);
    } catch (NumberFormatException nfex) {
        valid = false;
    }
} while (!valid);

当转换为整数失败时,JVM会挂起一点。我相信你的问题更多地与Scanner在幕后执行的try / catch机制有关,而不是与设计有关。

答案 3 :(得分:-1)

将DO WHILE用于结果

  do{
     System.out.print("value of x : " + x );
     x++;
     System.out.print("\n");
  }while( x < 20 );

好吗?