【问题标题】:I want to add a try/catch block for bad user input我想为错误的用户输入添加一个 try/catch 块
【发布时间】:2020-04-11 13:42:54
【问题描述】:

下面是我的代码,我想在 do/while 循环中添加一个 try/catch 块,以便为除数字以外的用户输入引发异常(即,如果用户输入 20 而不是 20)。我不确定如何编写比较来引发异常。

import java.util.Scanner;

public class Paint1 {

    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);
        double wallHeight = 0.0;
        double wallWidth = 0.0;
        double wallArea = 0.0;
        double gallonsPaintNeeded = 0.0;

        double squareFeetPerGallons = 350.0;

        // Prompt user to input wall's height
        System.out.println("Enter wall height (feet): ");
        wallHeight = scnr.nextDouble();
        while (wallHeight <= 0) {
            do {
                System.out.println("Wall height must be a number greater then zero and in arabic numeral format.");
                System.out.println("Enter wall height (feet): ");
                wallHeight = scnr.nextDouble();
            } while (wallHeight <= 0);
        }

        // Prompt user to input wall's width
        System.out.println("Enter wall width (feet): ");
        wallWidth = scnr.nextDouble();
        while (wallWidth <= 0) {
            do {
                System.out.println("Wall width must be a number greater then zero and in arabic numeral format.");
                System.out.println("Enter wall width (feet): ");
                wallWidth = scnr.nextDouble();
            } while (wallWidth <= 0);
        }

        // Calculate and output wall area
        wallArea = (wallHeight * wallWidth);
        System.out.println("Wall area: " + wallArea + " square feet");

        // Calculate and output the amount of paint (in gallons) needed to paint the wall
        gallonsPaintNeeded = (wallArea / squareFeetPerGallons);
        System.out.println("Paint needed: " + gallonsPaintNeeded + " gallons");
    }
}

【问题讨论】:

  • 这不是 JavaScript 代码,而是 Java。两种完全不同的语言。

标签: java


【解决方案1】:

初始化变量,这样如果 catch 块被执行,它将继续询问数字并在 catch 块中显示错误消息:

wallHeight = 0;
do {
    try {
        // Prompt user to input wall's height
        System.out.println("Enter wall height (feet): ");
        String input = scnr.next();
        wallHeight = Double.parseDouble(input);
    } catch (Exception e) {
        System.out.println("Wall height must be a number greater then zero and in arabic numeral format.");
    }
} while (wallHeight <= 0);

wallWidth = 0;
do {
    try{
        // Prompt user to input wall's width
        System.out.println("Enter wall width (feet): ");
        String input = scnr.next();
        wallWidth = Double.parseDouble(input);
    } catch (Exception e) {
        System.out.println("Wall width must be a number greater then zero and in arabic numeral format.");
    }
} while (wallWidth <= 0);

我要做的另一件事是,由于输入数据可能与双精度数据不同,因此您可以将其读取为字符串,以便消耗它,然后对其进行解析并捕获此异常,否则错误的输入仍然存在并且会导致infinite loop

另一种可能性是使用scnr.nextLine() 来使用catch 块中的输入,例如:

try {
    // Prompt user to input wall's height
    System.out.println("Enter wall height (feet): ");
    wallHeight = scnr.nextDouble();
} catch (Exception e) {
    System.out.println("Wall height must be a number greater then zero and in arabic numeral format.");
    scnr.nextLine();
}

请注意,您可以摆脱另一个 while,您只需要一个,在这种情况下,我使用了 do/while。

【讨论】:

  • 感谢您的帮助!这肯定会捕获异常,但我现在有一个新问题。如果用户输入错误,它会进入无限循环,而不会停止以允许新的用户输入。
  • 双重检查了代码,但仍然是同样的问题。错误的用户输入循环返回并执行“try”部分,但在执行“catch”之前不等待输入。
  • 是的,对不起,我的错误。在这种情况下,我所做的是将输入作为String,然后使用Float.parseFloat 并捕获此异常。这样,输入每次都会被消耗,无论它是否具有预期值,因为它正在等待一个字符串。立即查看
  • 修复了它。再次感谢!知道为什么它会进入那个循环吗?我很想弄清楚这一点。看起来好像有什么东西导致它每次都执行捕获而不是等待用户输入。
  • 发生这种情况是因为scnr.nextDouble 正在等待双精度,并且由于输入的数据不是双精度,因此它不会消耗该输入,因此下次它仍然有相同的数据待在输入中并且仍然不是双等等。这就是为什么如果您将其读取为字符串,则不会出现该问题,因为它会从输入中消耗,然后您可以对其进行解析。我已经用这个信息更新了答案。如果您可以通过单击复选标记将答案标记为正确,那就太好了。
猜你喜欢
  • 2011-10-10
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多