很奇怪为什么这个递归代码不起作用,并且在另一个方法中表现出非常异常的行为

时间:2014-09-21 20:50:17

标签: java recursion input while-loop

这里的新程序员,对于我认为会递归的一些代码存在一些问题。

public static int sum (int a) {
    int input = goodInput(); //get input from below method without having to put its code in this one
    if (input==-1)//so user has the ability to exit at any time
        return a; //when user has finally entered -1, the final sum is sent out
    else; //for scenarios before last input 
    int b = a + input; //adding the newest input to the sum 
    int c = sum(b); //throw the total into the method again until -1 is read
    return c; //once -1 is read, a in that iteration is sent up through every iteration of the method    until the original method gets its return
}
public static int goodInput () { //code to get input of correct type
    Scanner input = new Scanner (System.in);  
    while (!input.hasNextInt()) { //if I put in integer input, the loop should not be entered, but this isn't happening
        System.out.println("Integers only please");
        input.next();
    }
    int finalInput = input.nextInt(); //Finally set good input
    input.close(); //close scanner
    return finalInput; 
}

这里的第一种方法显然只是一种获得总和的方法。我知道有很多其他的方法可以将一些数字加在一起,我自己做了一些,但是当我的课上有关于方法的教训并写下类似我列出的代码之类的东西时,我就是第一件事可以认为是一种解决方案,而不是老师最后推荐的解决方案。无论如何,我认为这将是一次很好的学习练习。

这段代码没有显示eclipse中的任何错误,所以我很难理解为什么它拒绝工作。确实,它产生了我真正好奇的结果;它自然会在程序开头询问输入,但是当我输入0,1或任何其他int时,尽管扫描仪实际上有一个整数,"整数只是请"打印,然后Java在while循环结束时声明异常,在goodInput调用sum,返回c,并在main方法中执行sum,以及在java.util中.NoSuchElementException,java.util.Scanner.throwFor,以及java.util.Scanner.next。

我不知道这里发生了什么;我最好的猜测是记忆问题,但是第一次出现错误!并且goodInput中的代码在用作主方法时效果很好;不确定为什么被sum调用会导致问题。

同样,我不想要一些求和方法。我只是想知道代码为什么会以这种方式运行,以及如何实现与我的方法相加的实际工作。

1 个答案:

答案 0 :(得分:6)

这里不是递归问题,而是Scanner。我不得不承认我对Scanner课程并不太熟悉,但似乎如果您致电input.close()然后再重新goodInput,则System.in会被关闭。至少,通过调试器,我发现在goodInput的第二次调用中打印了“仅请求整数”这一行。删除行input.close();为我做了诀窍,你的方法按预期工作。

我建议您在main方法中初始化扫描程序,将其作为参数传递,然后在main方法中关闭它。

修改close的{​​{1}}方法声明如下:

  

如果这样   扫描仪尚未关闭,如果它的底层   java.lang.Readable可读也实现了java.io.Closeable   接口然后将调用可读的Scanner方法。

因此,当您在close上调用close时,基础读者即System.in已关闭。