返回值如何在递归方法中起作用?【JAVA]

rub*_*uby 2 java recursion return-value boolean-expression switch-statement

TLDR: java似乎只在方法运行时返回第一个值.我错了,还是有一种解决方法我不知道[不求助于循环]

我的目标是从返回的最后一个值[boolean]输出分配给方法,但是如果没有正确理解返回的工作原理我就无法做到.


代码的目的是通过读取用户输入从简单的选择[Y/N]返回布尔值.如果给出了错误的输出[例如:"p","P","apples"],则该方法应该再次提示用户,直到给出正确的输入.

这就是我开始使用的:

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" :              isNewRelease = true;  break;
        case "N" : case "n" :              isNewRelease = false; break;
        default  : /*Try again*/ nrCheck();                      break; 
    }

    return isNewRelease;
}
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,因为默认情况下不分配值,导致初始化错误.

尝试通过分配默认值来解决此问题,如下所示:

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" :        isNewRelease = true;            break;
        case "N" : case "n" :        isNewRelease = false;           break;
        default  : /*printTryagain*/ isNewRelease = null;  nrCheck();break; 
    }

    return isNewRelease;
}
Run Code Online (Sandbox Code Playgroud)

这提出了一个新问题.出于某种原因,当我再次回忆该方法时,已经设置了返回值.我试图玩代码的顺序,它并没有真正做太多.我的猜测是,一旦你回想起这个方法,就会自动设置返回值,如果第一次设置你就不能改变它.

而且我知道我能做到这一点,

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    do 
    {
        switch (movieType)
        {
            case "Y" : case "y" :        isNewRelease = true;            break;
            case "N" : case "n" :        isNewRelease = false;           break;
            default  : /*printTryagain*/ isNewRelease = null;  nrCheck();break; 
        }
    }
    while (movieType.equalsIgnoreCase("Y") || movieType.equalsIgnoreCase("N"))

    return isNewRelease;
}
Run Code Online (Sandbox Code Playgroud)

但个人不愿意,除非我完全清楚没有其他解决方案,或者我的代码中没有明显的明显错误.[也想扩展这段代码,使其变得更加通用].

最终,我希望能够理解我所犯的错误,或者在这种情况下是否存在任何错误,即使这意味着我必须废弃我的代码以进行do-while循环.

Era*_*ran 6

您应该返回递归调用返回的值:

private boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);

    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" : return true;
        case "N" : case "n" : return false;
        default  : return nrCheck();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果忽略该值,则首先进行递归调用是没有意义的.

PS,你可以改变方法的返回类型boolean,因为它永远不会返回null.