【问题标题】:Using Temporary Value in If Statement to Proceed to Try Catch在 If 语句中使用临时值继续尝试 Catch
【发布时间】:2018-12-09 17:59:26
【问题描述】:

我需要输入到数组中的值是 1-100 而不是任何字母。我试图设置一个临时值,该值将捕获之前不是 1-100 但似乎无法使其工作的数字。如果输入字母,我会遇到程序将关闭的问题。任何帮助将不胜感激。

public class FocusGroup {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double tempValue = scan.nextDouble();

        if (tempValue > 100 || tempValue < 0) {
            scan.nextDouble();
            System.out.println("Invalid");

        } else {

            while (true) {
                try {

                    double sumFocus = 0;
                    double[] arrayFocus = new double[2];

                    for (int i = 0; i < 2; i++) {
                        arrayFocus[i] = scan.nextDouble();
                    }
                    for (double num : arrayFocus) {
                        sumFocus = sumFocus + num;
                    }
                }

                catch (InputMismatchException e) {

                    System.out.println("Invalid input");
                    scan.nextLine();
                }

            }
        }
    }

}

【问题讨论】:

  • 最好创建一个附加方法,在无限循环中获取输入并在输入有效时返回。
  • 我不知道该怎么做...请您详细说明一下吗?
  • 您已经创建了一个无限循环 (while(true))。只需再次执行此操作并在其中输入,检查它是否有效return。如果您不想要其他方法,您也可以break 退出循环。

标签: java if-statement


【解决方案1】:

在您的 catch 语句中,您使用 scan.nextLine(),但您应该使用 scan.nextDouble(),就像您在主循环中所做的那样。也就是说,您希望接受双精度数作为输入。 此外,您的 try/catch 语法似乎是错误的。您想捕获可能由用户输入引起的错误;因此,您需要在 try 块中添加用户输入内容的代码。见下文:

try {
            double tempValue = scan.nextDouble();

            //this loop will keep spinning, until tempValue is valid
            while (tempValue > 100d || tempValue < 0d) {
                System.out.println("Invalid. Try again. Range is 0 - 100");
                tempValue = scan.nextDouble();
            }
            //this loop will spin forever (There is nothing to terminate it)
            while (true) {

                double sumFocus = 0;
                double[] arrayFocus = new double[2];

                for (int i = 0; i < 2; i++) {
                    arrayFocus[i] = scan.nextDouble();
                }
                for (double num : arrayFocus) {
                    sumFocus = sumFocus + num;
                }
            }
        }
        catch (InputMismatchException e) {

            System.out.println("Invalid input");
            scan.nextDouble(); //this doesn't do anything. The value is not assigned to any variable
        }

使用上述代码,当用户输入无效字符时,例如:字母,程序将停止。为什么?因为catch在无限循环之外,这使得你的程序计数器移动到循环之外,当catch语句中的代码被执行时,你的程序也将在到达结束时终止。

你可以做的是这样的:

static double validValueWithRange(Double min, Double max){
   Scanner s = new Scanner(System.in);
   System.out.println("Enter a valid value for a 'double': ");
   double value;
   try {
       value = s.nextDouble();
       if(value > max || value < min){
         System.out.println("Invalid. Try again. Range is 0 - 100");
         return validValueWithRange(min, max);
       }
    }
    catch (InputMismatchException e) {
        System.out.println("Invalid input. Try again.");
        return validValueWithRange(min, max);
    }

    return value;
}

static double validValue(){
    Scanner s = new Scanner(System.in);
    System.out.println("Enter a valid value for a 'double': ");
    double value;
    try {
        value = s.nextDouble();
    }
    catch (InputMismatchException e) {
        System.out.println("Invalid input. Try again.");
        return validValue();
    }

    return value;
}

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);

    double tempValue = validValueWithRange(0d, 100d);

    while (true) {
        System.out.println("Now entering endless while loop");
        double sumFocus = 0;
        double[] arrayFocus = new double[2];

        for (int i = 0; i < 2; i++) {
            arrayFocus[i] = validValue();
        }
        for (double num : arrayFocus) {
            sumFocus = sumFocus + num;
        }
    }
}

【讨论】:

  • 非常感谢您的时间和帮助。我刚刚运行了这段代码,但是当我输入一封信时,程序仍然关闭,我仍然卡在一个循环中。
  • @a.nguy1 如您所见,任何人都可能犯错误。很抱歉提供了错误的答案。这是更正的一个。这应该像一个魅力
  • 还更新了缩进以使答案更具可读性。如果这有助于解决您的问题,请考虑将其作为可接受的解决方案!
  • 效果很好,谢谢!
  • 如果我确实希望使用临时值作为数组的输入,我该如何做才能让用户只输入两个不同的数字而不是三个?
【解决方案2】:

你只需要将变量的初始化放在一个 try and catch 块中,如下所示:

try {
    double tempValue = scan.nextDouble();
} catch (InputMismatchException ex) {
    System.out.println("Please enter a number.");
}

【讨论】:

  • 我将如何实现 if 语句以使用此代码验证范围?
  • 这不会按照 OP 的要求执行。它只会显示一条错误消息并退出。也许如果您改进了答案以包含更多信息?
猜你喜欢
  • 2016-03-05
  • 2015-09-13
  • 2016-07-30
  • 2018-02-20
  • 2013-06-24
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多