递归函数

时间:2017-02-13 11:21:56

标签: java

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

  

请输入正整数值
  -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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

if(i < 0) {
    System.out.println("Please enter a positive valid integer");
    i = setInt(); //  <- HERE
}

答案 1 :(得分:1)

您永远不会更改无效的第一个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.next()删除错误输入,例如大于Integer.MAX_VALUE的值。