java - 为什么我在这段代码中收到无限递归警告,尽管它不是无限的?

标签 java recursion netbeans

所以我写了一段代码来捕获错误的输入格式,并要求用户更正。它工作正常,完全按照预期执行,但 Netbeans 抛出“方法 validate 将无限递归”警告。我对它进行了彻底的测试,它确实不会无限递归,所以我想知道是什么让 Netbeans 认为它​​会无限递归。

编辑:我现在意识到 int validInput = 0; 是这里的罪魁祸首。如果用户输入 char,它仍然设置为零并且循环中断。但我的主要观点仍然是为什么 Netbeans 实际上认为这段代码有可能无限递归,尽管有一些限制阻止它。

这是以下方法(请注意,maxBound 始终由数组长度预定义):

public static int validate(int maxBound) {
    int controlVar = maxBound;
    Scanner scan = new Scanner(System.in);
    boolean wrongInputLoopThrough = false;
    int validatedInput = 0;
    do {
        if (wrongInputLoopThrough) {
            System.out.println("Integer value is out of bound! Please repeat your input.");
        }
        try {
            validatedInput = Integer.parseInt(scan.nextLine());
            wrongInputLoopThrough = true;
        } catch (NumberFormatException e) {
            System.out.println("Not a number, please enter a number");
            validatedInput = validate(controlVar); //here is my recursion to return control flow back to the top of the method
        }
    } while (validatedInput < 0 || validatedInput > controlVar);
    return validatedInput;
}

最佳答案

您在捕获中再次调用验证,因此如果它无效并且您传递相同的值,它可能会无限期地捕获。你应该继续循环,而不是捕获它,就像它是一个超出界限的整数一样......

关于java - 为什么我在这段代码中收到无限递归警告,尽管它不是无限的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638446/

相关文章:

java - 从表单编码传递的土耳其语字符在浏览器上有所不同

java - 创建 ECDSA DER 编码签名

带计时事件的 JavaScript 递归 (setTimeout)

java - 如何从一个 jframe 访问另一个 jframe 的 arraylist

svn - 禁用 Netbeans 自动 svn 忽略?

java - 如何在 JPanel 中绘制形状?

java - 并发进程中的互斥

java - 不使用 Firebase 云消息传递或任何其他类似服务的 Android 推送通知

c++ - 如果没有递归光线跟踪,反射和折射是不可能的吗?

list - Haskell 自引用列表终止