Java 递归函数的意外返回值

Java 递归函数的意外返回值,java,Java,我写了一段简短的代码,目的是设置一个整数值。但是,它似乎没有返回正确的值。例如,对于以下输入,我希望它能像这样工作 请输入一个正整数值 -458 请输入一个正有效整数 58 58 但是,实际输出如下所示 请输入一个正整数值 -458 请输入一个正有效整数 58 -458 在本例中,为什么返回-458而不是58 import java.util.InputMismatchException; import java.util.Scanner; public class IncorectValue

我写了一段简短的代码,目的是设置一个整数值。但是,它似乎没有返回正确的值。例如,对于以下输入,我希望它能像这样工作

请输入一个正整数值
-458
请输入一个正有效整数
58
58

但是,实际输出如下所示

请输入一个正整数值
-458
请输入一个正有效整数
58
-458

在本例中,为什么返回
-458
而不是
58

import java.util.InputMismatchException;
import java.util.Scanner;

public class IncorectValueReturned {
    public void run() {
        System.out.println("Please enter a positive integer value");
        System.out.println(setInt());
    }

    private int setInt() {
        int i = -1;
        Scanner sc = new Scanner(System.in);
        try {
            i = sc.nextInt();
            if(i < 0) {
                System.out.println("Please enter a positive valid integer");
                setInt();
            }
        } catch(InputMismatchException iME) {
            System.out.println("Please enter a positive valid integer");
            setInt();
        }
        sc.close();
        return i;
    }

    public static void main(String[] args) {
        IncorectValueReturned iVR = new IncorectValueReturned();
        iVR.run();
    }
}
import java.util.InputMismatchException;
导入java.util.Scanner;
返回的公共类increctValues{
公开募捐{
System.out.println(“请输入正整数值”);
System.out.println(setInt());
}
私有int setInt(){
int i=-1;
扫描仪sc=新的扫描仪(System.in);
试一试{
i=sc.nextInt();
if(i<0){
System.out.println(“请输入一个正有效整数”);
setInt();
}
}捕获(输入不匹配异常输入法){
System.out.println(“请输入一个正有效整数”);
setInt();
}
sc.close();
返回i;
}
公共静态void main(字符串[]args){
IncorrectValueReturned iVR=新的IncorrectValueReturned();
iVR.run();
}
}

您没有从
SetInt()
分配
i
新值

if(i<0){
System.out.println(“请输入一个正有效整数”);

i=setInt();//您没有分配
i
来自
setInt()
的新值

if(i<0){
System.out.println(“请输入一个正有效整数”);

i=setInt();//如果您从未更改无效的第一个
i
,则需要恢复递归调用的值

i = setInt();
当然,你不应该一遍又一遍地重新申报这个扫描仪。 改用实例变量

Scanner sc = new Scanner(System.in);
private int setInt() {
    int i = -1;
    try {
        i = sc.nextInt();
        if(i < 0) {
            System.out.println("Please enter a positive valid integer");
            i = setInt();
        }
    } catch(InputMismatchException iME) {
        //Clear the scanner of this value
        sc.next();
        System.out.println("Please enter a positive valid integer");
        i = setInt();
    }
    return i;
}
Scanner sc=新扫描仪(System.in);
私有int setInt(){
int i=-1;
试一试{
i=sc.nextInt();
if(i<0){
System.out.println(“请输入一个正有效整数”);
i=setInt();
}
}捕获(输入不匹配异常输入法){
//清除扫描仪中的此值
sc.next();
System.out.println(“请输入一个正有效整数”);
i=setInt();
}
返回i;
}
完成后关闭扫描仪


小心,引发异常的值将保留在输入中,您需要读取它,我使用了
Scanner.next()
来删除错误的输入,例如大于
整数的值。MAX_value
如果您从未更改无效的第一个
I
,则需要恢复递归调用的值

i = setInt();
当然,你不应该一遍又一遍地重新申报这个扫描仪。 改用实例变量

Scanner sc = new Scanner(System.in);
private int setInt() {
    int i = -1;
    try {
        i = sc.nextInt();
        if(i < 0) {
            System.out.println("Please enter a positive valid integer");
            i = setInt();
        }
    } catch(InputMismatchException iME) {
        //Clear the scanner of this value
        sc.next();
        System.out.println("Please enter a positive valid integer");
        i = setInt();
    }
    return i;
}
Scanner sc=新扫描仪(System.in);
私有int setInt(){
int i=-1;
试一试{
i=sc.nextInt();
if(i<0){
System.out.println(“请输入一个正有效整数”);
i=setInt();
}
}捕获(输入不匹配异常输入法){
//清除扫描仪中的此值
sc.next();
System.out.println(“请输入一个正有效整数”);
i=setInt();
}
返回i;
}
完成后关闭扫描仪


小心,抛出异常的值将保留在输入中,您需要读取它,我使用了
Scanner.next()
删除错误输入,如大于
整数的值。MAX_value

谢谢。我不敢相信我没有看到XDDamn,太慢了。在捕获中也有同样的问题。这个方法只是一次性的。谢谢。我不敢相信我没有看到XDDamn,太慢了。捕获中也有同样的问题。这个方法很简单仅限一次。使用此修复程序,您知道为什么如果要输入一个更大的
整数。MAX_VALUE
它会抛出一个
StackOverflowerError
?@Dan,这会抛出一个
InputMismatchException
类似于文档状态:“如果下一个标记与整数正则表达式不匹配,或超出范围”@Dan,我的错,你需要刷新扫描仪,因为出现异常(
InputMismatchException
)保留溢出数,检查编辑,catch part使用此修复程序您知道为什么如果要输入一个更大的
整数。MAX_VALUE
它会抛出一个
堆栈溢出错误
?@Dan,这会抛出一个
输入不匹配异常
,如文档状态:“如果下一个标记与整数正则表达式不匹配,或超出范围”@Dan,my bad,您需要刷新扫描仪,因为异常(
InputMismatchException
)保留溢出号,请检查编辑、捕获部分