TLDR: java 似乎只在方法运行时返回第一个值。我对此是否错了,或者是否有我不知道的解决方法[不诉诸循环]?
我的目标是从分配给该方法的返回中输出最后一个值[ boolean ],但是如果没有正确理解返回的工作原理,我无法做到这一点。
<小时/>代码的目的是通过读取用户输入从简单的选择 [Y/N] 返回一个 boolean 值。如果给出了错误的输出[例如:“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;
}
显然这是行不通的,因为默认情况下不会赋值, 导致初始化错误。
尝试通过分配默认值来解决此问题,如下所示:
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;
}
这提出了一个新问题。由于某种原因,当我再次调用该方法时,返回值已经设置了。我尝试过调整代码的顺序,但它并没有多大作用。我的猜测是,一旦调用该方法,返回值就会自动设置,并且如果第一次设置,则无法更改它。
我知道我可以做到这一点,
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;
}
但个人不喜欢这样做,除非我完全意识到没有其他解决方案,或者我的代码中没有明显的错误。 [还想扩展此代码以变得更加通用]。
最终,我希望能够理解我犯了什么错误,或者如果没有任何错误,在这种情况下 return 的限制,即使这意味着我必须废弃 do-while 循环的代码。
最佳答案
您应该返回递归调用返回的值:
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();
}
}
如果您忽略该值,则首先进行递归调用就没有意义。
P.S.,您可以将该方法的返回类型更改为 boolean
,因为它永远不会返回 null
。
关于java - 在递归方法中返回值是如何工作的? [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368736/