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


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

最佳答案

您永远不会更改第一个无效的i,您需要恢复递归调用的值

i = setInt();


当然,您不应该一遍又一遍地声明此扫描仪。
请改用Instance变量。

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的值。

09-12 19:02