我是Java新手,我正在我的程序中研究一种方法,该方法检查用户输入是否在边界内,而不是空值(零),而不是字母和正数。所以最初我在这个方法中加入了两个while循环来检查这些输入的有效性,但我想在一个循环中简化它。我在输入一些字母后输入一个字母(例如a)时出现错误,我认为这是由于两个不同的while循环使它变得更复杂。有人可以帮帮我吗?
public static void valid(String s, int max)
{
while(sc.hasNextInt() == false) {
System.out.println("That is not correct. Try again:");
sc.nextLine();
}
int value;
while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){
System.out.println("That is not correct. Try again: ");
sc.nextLine();
}
sc.nextLine();
return;
}
答案 0 :(得分:1)
尝试更像(伪代码):
while valid input not yet received:
if input is an integer:
get integer
if in range:
set valid input received
skip rest of line
extended validation
经过一番思考,您应该能够使用一个&#34;打印错误消息&#34;声明。但使用两个可能会更好;它可以告诉用户他们做错了什么。
答案 1 :(得分:1)
你有:
int value;
while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){
System.out.println("That is not correct. Try again: ");
sc.nextLine();
}
两次执行sc.nextInt()
,因此value
在这两种情况下不一定具有相同的值,而且还要求您输入两次。
修复将是这样的:
int value;
while((value = sc.nextInt()) > max || value <= 0) {
System.out.println("That is not correct. Try again: ");
sc.nextLine();
}
会让它变得更好,但你仍然有问题。如果value
大于max
,那么循环将再次调用nextInt()
,但这次您未检查hasNextInt()
。这就是为什么你最好在一个循环中拥有所有东西。像这样:
public static void valid(String s, int max) {
while(true) {
if(!sc.hasNextInt()) { //this is the same as sc.hasNextInt() == false
System.out.println("That is not correct. Try again:");
sc.nextLine();
continue; //restart the loop again
} else {
int value = sc.nextInt();
if(value > max || value <= 0) {
System.out.println("That is not correct. Try again:");
sc.nextLine();
continue; //restart the loop from the top - important!
} else {
extendedValidation(value, s);
return;
}
}
}
}
答案 2 :(得分:0)
String s
参数的目的是什么?您应该检查而不是扫描仪输入吗?
另外,混淆nextInt()
和nextLine()
并不会感到惊讶。 - Source
我更喜欢在验证之前使用do-while循环进行输入。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int max = 1000;
int val = -1;
String in;
do {
// Read a string
System.out.print("Enter a number: ");
in = input.nextLine();
// check for a number
try {
val = Integer.parseInt(in);
} catch (NumberFormatException ex) {
// ex.printStackTrace();
System.out.println("That is not correct. Try again.");
continue;
}
// check your bounds
if (val <= 0 || val > max) {
System.out.println("That is not correct. Try again.");
continue;
} else {
break; // exit loop when valid input
}
} while (true);
System.out.println("You entered " + val);
// extendedValidation(value, in);
}
答案 3 :(得分:0)
我会说,这比你正在寻找的东西更接近,简单来说......
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
final int MIN = 0;
final int MAX = 10;
Scanner sc = new Scanner(System.in);
int value = -1;
boolean valid;
do {
valid = sc.hasNextInt();
if (valid) {
value = sc.nextInt();
valid = value > MIN && value < MAX;
}
if (!valid) {
System.out.println("Invalid!");
sc.nextLine();
}
} while (!valid);
System.out.println("Valid Value: " + value);
}
}
您应该能够抽象此代码以满足您的要求。