【问题标题】:Java try-catch input validation with do-while loopJava try-catch 输入验证与 do-while 循环
【发布时间】:2020-02-17 04:14:20
【问题描述】:

我已经(尴尬地)坐在这里好几个小时了,试图让一个 do-while 循环来接受用户输入,直到它有效为止,但是当涉及到我使用的布尔值时,我似乎搞砸了尝试退出循环。每当我可以让程序部分工作时,catch 异常就会无限重复。

Scanner scnr = new Scanner(System.in);

double wallHeight = 0.0;
boolean valid = false;

// Implement a do-while loop to ensure input is valid
// Prompt user to input wall's height
do {
    try {
        System.out.println("Enter wall height (feet): ");
        wallHeight = scnr.nextDouble();
        valid = false;

        if (wallHeight <=0) {
            throw new Exception ("Invalid Input");
        }
    }
    catch (Exception e) {
        System.out.println("Invalid Input");
    }
} while (!valid);

【问题讨论】:

  • 在上传两次将有效变量设置为false的代码时似乎也犯了错误。那是偶然的。

标签: java input try-catch do-while


【解决方案1】:

首先假设输入为valid(并在循环的每次迭代中将valid 设置为true)。仅在遇到异常(希望是您提出的异常)时将 valid 设置为 false

do {
    valid = true;
    try {
        System.out.println("Enter wall height (feet): ");
        wallHeight = scnr.nextDouble();
        if (wallHeight <= 0) {
            throw new Exception("Invalid Input");
        }
    } catch (Exception e) {
        valid = false;
        System.out.println("Invalid Input");
    }
} while (!valid);

请注意,您在这里似乎需要例外,因为

do {
    valid = true;
    System.out.println("Enter wall height (feet): ");
    wallHeight = scnr.nextDouble();
    if (wallHeight <= 0) {
        System.out.println("Invalid Input");
        valid = false;
    }
} while (!valid);

也可以。当然,这假设用户只输入有效的double(s)。如果您需要处理任意输入,您应该在尝试使用它之前检查是否存在double(并且您必须使用任何不是double 的东西,否则您有一个无限循环)。喜欢,

do {
    valid = true;
    System.out.println("Enter wall height (feet): ");
    if (scnr.hasNextDouble()) {
        wallHeight = scnr.nextDouble();
        if (wallHeight <= 0) {
            System.out.println("Invalid Input");
            valid = false;
        }
    } else {
        System.out.println("Invalid Input " + scnr.nextLine());
        valid = false;
    }
} while (!valid);

【讨论】:

  • 对不起,我没有正确描述问题。但是我想在收到有效输入后退出循环,并在输入无效时返回循环顶部。
  • @Bmore 这就是这段代码的作用。当循环应该重复时,valid 应该只是false。因此,您必须在某个时候将其设置为true,否则循环将永远运行。
  • 好的,非常感谢。这就是我在处理替代输入时遇到的问题。我认为 try-catch 将有助于处理字符串输入等问题。它们不能在 do-while 循环中工作还是 scnr.hasNextDouble() 绝对必要?只是为了让我知道未来。
  • 可以,但你需要在catch 块中使用scnr.nextLine()(否则不会消耗导致异常的东西)。
  • 乐于助人。欢迎来到堆栈溢出。请拨打tour
【解决方案2】:

这是另一个例子。我只是在 if 检查之后移动了设置 valid = true 的代码。只有当它有效时,它才能做到这一点。否则 valid 将是 false 并且它将循环。

public class BasicDoWhile {

    public static void main(String[] args) {
        double wallHeight = 0.0;
        boolean valid = false;

        Scanner scnr = new Scanner(System.in);

        // Implement a do-while loop to ensure input is valid
        // Prompt user to input wall's height
        do {
            try {
                System.out.println("Enter wall height (feet): ");
                wallHeight = scnr.nextDouble();

                if (wallHeight <= 0) {
                    throw new Exception("Invalid Input");
                }

                valid = true;

            }
            catch (Exception e) {
                System.out.println("Invalid Input");
            }

        } while (!valid);

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多