Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVA中要求用户递归地输入特定范围之间的值?_Java_Recursion_Stack_Java.util.scanner_Activation Record - Fatal编程技术网

在JAVA中要求用户递归地输入特定范围之间的值?

在JAVA中要求用户递归地输入特定范围之间的值?,java,recursion,stack,java.util.scanner,activation-record,Java,Recursion,Stack,Java.util.scanner,Activation Record,我正在用Java编写一个代码,系统将要求用户输入1到10之间的整数(包括1和10),如果值超出范围,则应递归地要求用户再次输入值。最后我必须打印出在范围内的值。 下面是我的代码: `导入java.util.Scanner; 公共类输入整合器{ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Enter first Integer betw

我正在用Java编写一个代码,系统将要求用户输入1到10之间的整数(包括1和10),如果值超出范围,则应递归地要求用户再次输入值。最后我必须打印出在范围内的值。 下面是我的代码:

`导入java.util.Scanner; 公共类输入整合器{

public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Enter first Integer between 1 and 10 (both inclusive):");
    Scanner sc = new Scanner(System.in);
    int num1 = isInRange(sc, sc.nextInt());

    System.out.println("Enter Second Integer between 1 and 10 (both inclusive):");
    int num2 = isInRange(sc, sc.nextInt());

    System.out.println("Num 1 is "+num1+"\nNum 2 is "+num2);    
    sc.close();
}

public static int isInRange(Scanner scanner, int num) {
    if(num<1 || num>10) {
        System.out.println("WRONG INPUT. PLease enter Integer between 1 and 10 (both inclusive):");
        num =scanner.nextInt();
        isInRange(scanner, num);

    }
    return num;
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
System.out.println(“输入1到10之间的第一个整数(包括1和10):”;
扫描仪sc=新的扫描仪(System.in);
int num1=isInRange(sc,sc.nextInt());
System.out.println(“输入介于1和10之间的第二个整数(包括1和10):”;
int num2=isInRange(sc,sc.nextInt());
System.out.println(“Num 1为“+num1+”\nNum 2为“+num2”);
sc.close();
}
公共静态int isInRange(扫描仪,int num){
if(num10){
System.out.println(“输入错误,请输入1到10之间的整数(包括1和10):”;
num=scanner.nextInt();
isInRange(扫描仪,数字);
}
返回num;
}
}`

这将是我的输出:


我面临的问题是,当我输入错误的值时,最终当我输入正确的值时,它将打印我在第二次输入的值。假设我输入了8个超出范围的值,之后我的第9个值在范围内,因此它将打印第二次输入的值。

您遗漏了一点细节:

public static int isInRange(Scanner scanner, int num) {
                if(num<1 || num>10) {
                    System.out.println("WRONG INPUT. PLease enter Integer between 1 and 10 (both inclusive):");
                    num = scanner.nextInt();
                    num = isInRange(scanner, num); // add "num = " at the beginning of the line
                }
                return num;
            }
public static int-isInRange(扫描器扫描器,int-num){
if(num10){
System.out.println(“输入错误,请输入1到10之间的整数(包括1和10):”;
num=scanner.nextInt();
num=isInRange(scanner,num);//在行首添加“num=”
}
返回num;
}

isInRange()返回一个您忘记设置为num的整数。

您是否使用调试器检查了代码?使用调试器并单步执行代码是这个问题的最佳答案。为什么这个问题被标记为
[activationrecord]
?@JonnyHenly我一直在调试这个问题,在方法中的return语句之前放置System.out.println(num)。它正在打印用户输入的所有输入,除了第一次输入。这个问题有激活记录标签,因为当你在Java中调用一个方法时,会有一个为该函数创建的激活记录,它以堆栈的形式存储在内存中。递归地这样做真的很重要吗?也许你能找到更好的方法。一个问题是,即使一个数字“超出范围”,它仍然会在isInRange()的末尾返回。@GitPhilter是的,我知道使用循环可以很容易地完成,但我只想知道如何修复这个问题以及我做错了什么?使用
System.out.println(num)
将无法显示每个变量的值(以及许多其他信息)当您执行递归时。调试器将允许您设置断点、进出函数/方法、查看变量值、更改变量值等。认真研究使用调试器,从长远来看,它将为您节省大量时间。您还可以使用
num=isInRange(scanner,scanner.nextInt())
而不是在递归调用之前分配
num
。可以说它可读性较差,但更紧凑。@GitPhilter谢谢,它是固定的。你能给我一个简单的解释吗,它是如何固定的?这是不是超过了堆栈中的所有值?@Jonny Hely是的,这也是可能的。我的解决方案有点奇怪,因为你在两个连续的行中将一个值指定为num,这看起来很奇怪。@Parteek Singh Bedi您的函数isInRange返回正确的int,并在末尾加上“return num”,但您从未使用返回的值。