如何处理斐波那契数列的无效输入

How to handle invalid input for Fibonacci Sequence

提问人:RileyGT 提问时间:8/31/2023 最后编辑:M. YousfiRileyGT 更新时间:9/2/2023 访问量:55

问:

我正在尝试创建一个斐波那契数列生成器,其中所有无效的输入情况在要求用户重试之前都有响应。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("The Fibonacci Sequence is the series of whole positive numbers where the next number is found by adding up the two numbers before it. \nGive it a try!");
    double number = 0; //
    boolean error;

    do {

        try {
            error = false;
            System.out.println("Enter a number to use as an upper limit. The Fibonacci Sequence will be generated up to that number.");
            number = in.nextDouble();
            if (number % 1 != 0 || number < 0) {
                System.err.println("The Fibonacci Sequence only works with positive whole numbers, please enter a positive integer.");
            } else {
                System.out.println("The Fibonacci Sequence is: ");
                int i = 0;
                int f0 = 0;
                int f1 = 1;
                int fn;
                double value = 0; // changed this to double which is redundant since value is not used
                do {
                    fn = f0 + f1;
                    System.out.print(f0 + " ");
                    f0 = f1;
                    f1 = fn;
                    value = number - f0;
                    i++;
                } while (f0 <= number);
            }
        } catch (Exception e) {
            System.out.println("The Fibonacci Sequence only works with positive whole numbers, please enter a positive integer.");
            error = true;
        }
    } while (number < 0 || number % 1 != 0 || error) ;
}

但是,当我将 try/catch 与我的 do-while 循环一起使用时,我会在 catch 和输入提示中得到消息的无限循环。

斐波那契数列仅适用于正整数,请输入正整数。 输入要用作上限的数字。斐波那契数列将生成到该数字........

我在 Java 方面还不是超级高级,所以现在我想找到使用这个逻辑的解决方案,只是找到一种方法来修复我的代码。谢谢!

java 异常 while-loop try-catch

评论

0赞 hermit 8/31/2023
如果输入无效,您想编程退出吗?
0赞 Joan 8/31/2023
难道您不希望用户在@RileyGT发生错误时重试吗?

答:

0赞 WJS 8/31/2023 #1

它适用于任何情况,除非您输入非数字。它循环是因为输入缓冲区中仍然有一个值,因此错误不断重复。因此,您需要删除 catch 块中的该输入,如下所示:

catch (Exception e) {
                    System.out.println("The Fibonacci Sequence only works with positive whole numbers, please enter a positive integer.");
                    error = true;
                    in.nextLine();  // <-- Remove problem input
                }

顺便说一句,既然你只想要积极,你为什么要提示双打?您可能需要执行以下操作:ints

int number;
// then later

number = in.nextInt();

这是对我认为您可能想要的略有修改。我还提供了一个退出程序的友好方式。

Scanner in = new Scanner(System.in);
System.out.println(
        "The Fibonacci Sequence is the series of whole positive numbers where the next number is found by adding up the two numbers before it. \nGive it a try!");
int number = 0; //
boolean error;

for (;;) { // loop forever (or until user enters 'quit`)
    System.out.println(
            "Enter a number to use as an upper limit. The Fibonacci Sequence will be generated up to that number.");
    try {
        number = in.nextInt();
    } catch (Exception e) {
        // input problem, see if user wants to quit
        String value = in.next();
        if (value.equalsIgnoreCase("quit")) {
            System.out.println("Bye!");
            return;
        }
        // some other errored input so force error message
        number = -1; 
    }
    if (number < 0) {
        System.err.println(
                "The Fibonacci Sequence only works with positive whole numbers, please enter a positive integer.");
    } else {
        System.out.println("The Fibonacci Sequence is: ");
        int i = 0;
        int f0 = 0;
        int f1 = 1;
        int fn;
        double value = 0; // changed this to double which is redundant
                          // since value is not used
        do {
            fn = f0 + f1;
            System.out.print(f0 + " ");
            f0 = f1;
            f1 = fn;
            value = number - f0;
            i++;
        } while (f0 <= number);
        System.out.println();
    }
}

评论

1赞 RileyGT 9/1/2023
哇,我有很多东西要学,谢谢!
0赞 WJS 9/1/2023
@RilyeGT 我也是,:)