在输入有效之前,如何请求用户输入?

时间:2018-06-13 02:39:19

标签: java exception exception-handling conditional

我想让用户输入两个代表三角形边的双打,然后计算斜边。首先,用户指定他们想要的命令(A,B,C或Q),然后对于A和B(侧输入),他们被要求输入双。现在,当他们没有输入双精度时,程序会要求他们输入第一个输入(A,B,C,Q)。我希望程序只要求输入另一个双精度,直到输入有效。

我的代码如下:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

    Double sideA = null;
    Double sideB = null;
    Scanner scanner = new Scanner(System.in);


    while (true) {

        System.out.println("Enter command: ");
        String command = scanner.nextLine();

        try {   // checks command, throws exception if not A, B, C or Q
            if (command.equals("A")) {
                System.out.println("Enter a value for side A:");
                sideA = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();
                try {
                    if (sideA < 0 || sideA == 0.0) {
                        throw new InputMismatchException();
                    }
                } catch (InputMismatchException e) {
                    System.out.println("Value is invalid. Must be positve and a double.");
                }

            }
            else if (command.equals("B")) {
                System.out.println("Enter a value for side B:");
                sideB = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();

                try {
                    if (sideB < 0 || sideB == 0.0) {
                        throw new InputMismatchException();
                    }
                } catch (InputMismatchException e) {
                    System.out.println("Value is invalid. Must be positive and a double.");
                }

            }
            else if (command.equals("C")) {
                Triangle calculate = new Triangle(sideA, sideB);
                System.out.println(calculate.calcHypotenuse());
                break;
            }
            else if (command.equals("Q")) {
                System.exit(0);
            }
            else {
                throw new IllegalArgumentException();
            }

        } 
        catch (IllegalArgumentException e) {
            System.out.println("Command is invalid, Enter A, B, C, or Q.");
        }
        catch (InputMismatchException e) {
            System.out.println("Value is invalid. Must be positve and a double.");
            scanner.nextLine();
        }

    }
}   

}

3 个答案:

答案 0 :(得分:0)

快速查看代码,只需在while循环外移动命令字符串即可实现所需内容

String command = null;
while (true) {

    if (command == null) {
        System.out.println("Enter command: ");
        command = scanner.nextLine();
    }
    ....

}

另外,请考虑合并try-catch代码,以免您重复代码

答案 1 :(得分:0)

使用嵌套的while循环来获得所需的double值:

private Scanner scanner = new Scanner(System.in);

private double getDoubleInput() {
    double ret = -1;
    while (ret < 0) {
        try {
            ret = scanner.nextDouble(); 
        }catch (InputMismatchException e) {
            System.out.print("Enter a valid double value: ");
        }
    }
    return ret;
}

通过提示用户输入有效的double值直到输入正双精度来处理NaN和负数。确保将Scanner变为类变量,以便此方法可以访问它。

答案 2 :(得分:0)

好的,首先也是最好的,请妥善缩进并提供足够的评论来解释您的思考过程。

其次,还有一些事情尚不清楚。

try {   // checks command, throws exception if not A, B, C or Q
            if (command.equals("A")) {
                System.out.println("Enter a value for side A:");
                sideA = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();

在上面提到的代码中,在最后一行中,你有一个来自Scanner类对象的输入,它没有存储到任何东西中。

你为什么需要它?它的目的是什么?

第三,代码中存在大量代码重复,IF-ELSE-IF的数量。使用 SWITCH 尝试相同的代码,如果你使用 SWITCH 而不是 IF-ELSE ,这就是你可以避免的问题。

您仍然将提示设置为enter a command的原因是因为您已将其置于while循环中。将其从那个地方移除并将其替换到外面就可以了。

这让我想到了最后一点,一旦你得到你需要的东西 正确答案例外的无效输入,那么为什么你需要一次又一次地检查同一个语句吗?

while(true){
      ......
      ......
      ......
}

将无限运行,并一遍又一遍地检查相同的条件,给出与输出无限次相同的异常。

要解决此问题,请删除while loop或从用户那里获取其他输入,直到他输入所需的值,然后在达到所需的输出break