我正在尝试创建一个循环验证方法来测试数据类型和范围

I'm trying to create a looping validation method that tests data type and range

我是 java 的新手,我正在修改我的代码并决定创建一个输入验证方法,我的问题是我如何通过验证循环输入。

首先,我决定将输入作为字符串来执行 try/catch 双精度,这没问题,现在我需要测试输入是否在 0-100 范围内。当然,我想检查用户是否会在“范围检查”中输入双精度值。我写的东西有点管用,但是当输入通过数据类型验证但没有通过范围检查时,它仍然会 return 第一个双精度数,无论我接下来输入什么。

public static double check(String n){
        boolean done = false;
        double i=0.0;
        Scanner beep = new Scanner(System.in);
        while (!done) {
            try { 
                i = Double.parseDouble(n);
                done = true;   
            } catch (Exception e) {
                System.out.print("Please input a valid grade (0-100): ");
                n = beep.nextLine();
            }
        }
        double b = rangetest(i);
        return b;
    }

    public static double rangetest (double n){
        if (n > 100 || n < 0){
            System.out.print("0-100 only ");
            Scanner beep = new Scanner(System.in);
            check(beep.next());
        }
        return n;

    }

public static void main(String[] args) {
    
        Scanner beep = new Scanner(System.in);
        double ave = 0.0;
        int rounded;
        for (int i = 1; i <= 5; i++)
        {
            System.out.print("Input grade number " + i + " : ");
            ave += rangetest(check(beep.next()));
        }
        ave /= 5;
        rounded = (int)Math.round(ave);
}

有没有更简单的方法或解决方法?还是我做错了?干杯!

当心 Scanner#next,这可能会在缓冲区中留下悬空的换行符,这会扰乱您的工作流程,但是,核心问题在于您的 rangetest

public static double rangetest (double n){
    if (n > 100 || n < 0){
        System.out.print("0-100 only ");
        Scanner beep = new Scanner(System.in);
        check(beep.next());
    }
    return n;

}

此处,如果值不在指定范围内,则再次调用check,但忽略了结果,因此最终返回了n的原始值

你似乎想做...

n = rangetest(check(beep.next()))

if 块内。

您可以使用 do-while 循环完成类似的事情,例如...

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Double value = getDoubleWithinRange(scanner, "Make me an offer ([X] to exit): ", "That's not a reasonable offer", "X", 0, 100, "Value is not within a valid range (0-100)");
        if (value != null) {
            System.out.println("You mad an offer of " + value);
        }
    }

    public static Double getDoubleWithinRange(Scanner input, String prompt, String errorMessage, String exitValue, double min, double max, String rangeErrorMessage) {
        boolean done = false;
        Double value = null;
        do {
            value = getDouble(input, prompt, errorMessage, exitValue);
            if (value != null) {
                if (isWithinRange(value, 0, 100)) {
                    done = true;
                } else {
                    beep();
                    System.out.println(rangeErrorMessage);
                }
            } else {
                done = true;
            }
        } while (!done);
        return value;
    }

    public static void beep() {
        java.awt.Toolkit.getDefaultToolkit().beep();
    }

    public static boolean isWithinRange(double value, double min, double max) {
        return value >= min && value <= max;
    }

    public static Double getDouble(Scanner input, String prompt, String errorMessage, String exitValue) {
        Double value = null;
        boolean exit = false;
        do {
            System.out.print(prompt);
            String nextLine = input.nextLine();
            Scanner parser = new Scanner(nextLine);
            if (parser.hasNextDouble()) {
                value = parser.nextDouble();
            } else if (nextLine.equals(exitValue)) {
                exit = true;
            } else {
                beep();
                System.out.println(errorMessage);
            }
        } while (!(value != null || exit));
        return value;
    }

}

nb: 我有一个可用的退出条件,你不需要它,但作为演示很好

我根据@MadProgrammer 的代码为自己设计了一个函数(谢谢大佬!),这在某种程度上更简单了一点。

public static double getValue() {
    Scanner beep = new Scanner(System.in);
    boolean flag = true;
    double value=0.0;
    while(flag==true){
        if(beep.hasNextDouble()){
            value = beep.nextDouble();
            if(value>=0&&value<=100){  
                flag=false;
            }
            else{
                System.out.print("Invalid input, 0-100 only: ");
                beep.nextLine();
            } 
        }
        else{
            System.out.print("That's not a numerical value, try again: ");
            beep.nextLine();
        }
    }
    return value;
}

随时发表评论,进行更正and/or提出任何可以使它变得更好的建议。