在递归函数中使用Scanner类

时间:2014-04-27 11:16:34

标签: java recursion

我正在尝试使用一个使用Scanner类的递归方法/函数。关闭扫描程序会导致在下次在递归中调用相同方法时抛出异常。解决方法是不要关闭扫描仪,但这不是一个正确的方法。我怀疑在递归调用之间使用了相同的扫描程序对象,因此关闭它会造成严重破坏。如果我的假设是正确的,那么在最后一个方法调用中关闭扫描器将是一个有效的解决方法(即没有实际的资源泄漏)。在进入Scanner和相关实现代码之前,有什么我可能会遗漏的吗?

修改

提供的答案非常有用且具有启发性。总之,问题是扫描仪不断重新打开和关闭,而不是递归本身。我避免将scanner对象作为参数传递的原因是这个例子模拟了一个更大的项目,调用了多个递归函数,我必须在所有这些函数中传递扫描器对象。

在实际方面,从提供的答案中,我认为只需在最后一次递归调用中关闭扫描器就可以在没有任何资源泄漏的情况下工作。欢迎提出任何相关意见,尤其是如果你看到我的方法有问题。

以下是我最初的实验示例:

package scanner;

import java.util.Scanner;

public class Main {

  public static void acceptValidInput() {

    System.out.print("Enter a number greater than 10: ");
    Scanner sc = new Scanner(System.in);
    int i = sc.nextInt();

    // Adding this will make an exception to be thrown:
    sc.close();

    if (i <= 10) {
        acceptValidInput();
    }
}

  public static void main(String[] args) {
    acceptValidInput();
    System.out.println("Your input is valid");
  }
}

4 个答案:

答案 0 :(得分:2)

有效:

package scanner;

import java.util.Scanner;

public class Main {

    public static void acceptValidInput(Scanner sc) {

        int i = sc.nextInt();

        if (i <= 10) {
            System.out.print("Enter a number greater than 10: ");

            acceptValidInput(sc);
        }
    }

    public static void main(String[] args) {

        System.out.print("Enter a number greater than 10: ");
        Scanner sc = new Scanner(System.in);

        acceptValidInput(sc);
        sc.close();

        System.out.println("Your input is valid");
    }
}

结果是:

Enter a number greater than 10: 4
Enter a number greater than 10: 5
Enter a number greater than 10: 11
Your input is valid

Process finished with exit code 0

答案 1 :(得分:1)

关闭扫描仪也会关闭基础输入流。在这种情况下,它是System.in流 - 你不应该这样做。要么不关闭它,要么为所有方法调用创建一个扫描程序。

答案 2 :(得分:1)

使用Scanner开始使用输入流后,您不应再尝试以任何其他方式从中读取输入流。换句话说,在您构建Scanner以从System.in读取后,您需要将其用于System.in的所有进一步阅读。这是因为Scanner buffers input,所以你不知道它已消耗了多少输入但尚未发出。

因此,我建议您构建一个Scanner,然后将其用于所有阅读:

public class Main {
  public static void acceptValidInput(Scanner sc) {
    System.out.print("Enter a number greater than 10: ");

    int i = sc.nextInt();

    if (i <= 10) {
      acceptValidInput(sc);
    }
  }

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    acceptValidInput(sc);
    System.out.println("Your input is valid");
    sc.close();
  }
}

答案 3 :(得分:-1)

public class abc{
public void acceptValidInput() {

    System.out.print("Enter a number greater than 10: ");
    Scanner sc = new Scanner(System.in);
    int i = sc.nextInt();

    // Adding this will make an exception to be thrown:


    if (i <= 10) {
        acceptValidInput();
    }
}

  public static void main(String[] args) {
     while(true){
      abc a=new abc();
   a.acceptValidInput();
   System.out.println("Your input is valid");
     }
  }}

试试这个。