gpt4 book ai didi

java - 在递归函数中使用 Scanner 类

转载 作者:行者123 更新时间:2023-11-30 08:23:55 32 4
gpt4 key购买 nike

我正在尝试使用递归方法/函数,它使用 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");
}
}

最佳答案

一旦您开始使用 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();
}
}

关于java - 在递归函数中使用 Scanner 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23322686/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com