java 为什么在我的方法接受输入之前,我必须输入两次?

3df52oht  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(128)

我正在制作一个简单的抵押贷款计算器,并尝试在进入下一个方法之前通过两个“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非常生疏,哈哈!

a64a0gku

a64a0gku1#

每次调用scanner.nextLine()时,都必须提供额外的输入。
让我给你的方法写一些注解来说明这几点:

public static Integer checkPrincipalValidation(Scanner scanner) {
    while (true) {
        if (scanner.hasNextInt()) {  // (1)
            principal = parseInt(scanner.nextLine());  // (2)
            if (principal >= 1_000 && principal <= 1_000_000) {
                break;
            }
            //  (3) is the next line
            System.out.println(scanner.nextLine() + " is not between 1,000 and 1,000,000. Please enter correct Principal (1K - $1M):");
        }
        if (!scanner.hasNextInt()) {  // (4)
            //  (5) is the next line
            System.out.println(scanner.nextLine() + " is not a valid integer. Please enter correct Principal (Integer):");
        }
    }
    return principal;
}

在标记为(1)的代码行上,检查输入是否包含有效的整数值。
如果是,那么在代码行(2)读取该值,解析它并将值存储在principal中。
然后,如果主体的值超出了有效范围,则读取代码行(3)的下一行输入。这与代码行(2)读取的值不同-该值已被使用,无法再次检索!
然后在代码行(4)再次检查输入的下一个值是否为有效整数值,如果没有有效整数值,则在代码行(5)使用该输入。
总体效果如下:
例如,如果用户输入值“1”,则该值通过代码行(1)上的条件,从输入中读取,并在代码行(2)上解析为int值。
由于此值不在1,000〈= value〈= 1_000_000的有效范围内,代码将继续执行第(3)行,在该行中,您要求用户输入另一行,以便告诉他此新输入不在1,000和1,000,000之间
然后,代码前进到代码行(4),并期待一个额外的输入。
要解决这个问题,你应该重写你的代码,也许像这样:

public static int checkPrincipalValidation(Scanner scanner) {
    while (true) {
        if (scanner.hasNextInt()) {
            principal = scanner.nextInt();
            if (principal >= 1_000 && principal <= 1_000_000) {
                break;
            }
            System.out.println(principal + " is not between 1,000 and 1,000,000. Please enter correct Principal (1K - $1M):");
        } else {
            System.out.println(scanner.nextLine() + " is not a valid integer. Please enter correct Principal (Integer):");
        }
    }
    return principal;
}

请注意,虽然这段代码解决了您的直接问题,但当您使用scanner.nextLine()读取以下输入时,可能会遇到其他问题-有关详细信息,请参阅Scanner is skipping nextLine() after using next() or nextFoo()中的答案。
问题和答案的要点是:如果您的输入包含混合输入(一方面是数字或单个单词等单个标记,另一方面是完整的输入行),那么使用Scanner会非常困难。

相关问题