我需要用户输入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以检查条件,但不能这样做,因为我不知道用户将输入什么)。
也许有更好的设计来实现这一切。这些也受到欢迎。
提前致谢。
答案 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++;
}
}
,然后使用String
将String
转换为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 );
好吗?