我正在制作一个简单的抵押贷款计算器,并尝试在进入下一个方法之前通过两个“if语句”验证两件事:首先检查扫描器的输入是否为整数;如果是,则检查整数是否在1,000和1,000,000之间。
具体代码如下:
public static Integer checkPrincipalValidation(Scanner scanner) {
while (true) {
if (scanner.hasNextInt()) {
principal = parseInt(scanner.nextLine());
if (principal >= 1_000 && principal <= 1_000_000) {
break;
}
System.out.println(scanner.nextLine() + " is not between 1,000 and 1,000,000. Please enter correct Principal (1K - $1M):");
}
if (!scanner.hasNextInt()) {
System.out.println(scanner.nextLine() + " is not a valid integer. Please enter correct Principal (Integer):");
}
}
return principal;
}
以下是整个文件,如果有兴趣:
import java.util.Scanner;
import static java.lang.Float.parseFloat;
import static java.lang.Integer.parseInt;
public class Validation {
static int principal;
public static Integer checkPrincipalValidation(Scanner scanner) {
while (true) {
if (scanner.hasNextInt()) {
principal = parseInt(scanner.nextLine());
if (principal >= 1_000 && principal <= 1_000_000) {
break;
}
System.out.println(scanner.nextLine() + " is not between 1,000 and 1,000,000. Please enter correct Principal (1K - $1M):");
}
if (!scanner.hasNextInt()) {
System.out.println(scanner.nextLine() + " is not a valid integer. Please enter correct Principal (Integer):");
}
}
return principal;
}
public static Float checkInterestValidation(Scanner scanner) {
while (true) {
if (scanner.hasNextFloat() || scanner.hasNextInt()) {
if (scanner.hasNextInt()) {
return parseFloat(scanner.nextLine());
}
return scanner.nextFloat();
} else {
System.out.println(scanner.nextLine() + " is not a valid rate");
System.out.print("Please enter correct Rate: ");
}
}
}
public static Integer checkPeriodValidation(Scanner scanner) {
while (true) {
if (scanner.hasNextInt()) {
return scanner.nextInt();
} else {
System.out.println(scanner.nextLine() + " is not a valid period");
System.out.print("Please enter correct Period (Years): ");
}
}
}
}
当它通过第一个“if语句”时,我必须在它进入第二个“if语句”之前输入两次数字。为什么?谢谢你的时间。我停了一年的编码工作,所以我对java非常生疏,哈哈!
1条答案
按热度按时间a64a0gku1#
每次调用
scanner.nextLine()
时,都必须提供额外的输入。让我给你的方法写一些注解来说明这几点:
在标记为(1)的代码行上,检查输入是否包含有效的整数值。
如果是,那么在代码行(2)读取该值,解析它并将值存储在
principal
中。然后,如果主体的值超出了有效范围,则读取代码行(3)的下一行输入。这与代码行(2)读取的值不同-该值已被使用,无法再次检索!
然后在代码行(4)再次检查输入的下一个值是否为有效整数值,如果没有有效整数值,则在代码行(5)使用该输入。
总体效果如下:
例如,如果用户输入值“1”,则该值通过代码行(1)上的条件,从输入中读取,并在代码行(2)上解析为
int
值。由于此值不在1,000〈= value〈= 1_000_000的有效范围内,代码将继续执行第(3)行,在该行中,您要求用户输入另一行,以便告诉他此新输入不在1,000和1,000,000之间
然后,代码前进到代码行(4),并期待一个额外的输入。
要解决这个问题,你应该重写你的代码,也许像这样:
请注意,虽然这段代码解决了您的直接问题,但当您使用
scanner.nextLine()
读取以下输入时,可能会遇到其他问题-有关详细信息,请参阅Scanner is skipping nextLine() after using next() or nextFoo()中的答案。问题和答案的要点是:如果您的输入包含混合输入(一方面是数字或单个单词等单个标记,另一方面是完整的输入行),那么使用
Scanner
会非常困难。