扫描仪从未关闭

2022-09-01 11:37:05

我正在开发一款游戏,但我的扫描仪遇到了一个小问题。我得到了一个从未关闭的资源泄漏扫描程序。

但我认为我的扫描仪以前在没有关闭它的情况下工作。但现在不是了。任何人都可以在这里帮助我吗?

import java.util.Scanner;

public class Main {

    public static final boolean CHEAT = true;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int amountOfPlayers;
        do {
            System.out.print("Select the amount of players (1/2): ");
            while (!scanner.hasNextInt()) {
                System.out.println("That's not a number!");
                scanner.next(); // this is important!
        }

        amountOfPlayers = scanner.nextInt();
        while ((amountOfPlayers <= 0) || (amountOfPlayers > 2));
        System.out.println("You've selected " + amountOfPlayers+" player(s)."); 
    }
}

答案 1

我假设你正在使用java 7,因此你会得到一个编译器警告,当你不关闭资源时,你应该关闭你的扫描仪,通常在一个最终的块中。

Scanner scanner = null;
try {
    scanner = new Scanner(System.in);
    //rest of the code
}
finally {
    if(scanner!=null)
        scanner.close();
}

或者更好的是:使用新的 Try with resource 语句

try(Scanner scanner = new Scanner(System.in)){
    //rest of your code
}

答案 2

根据 Scanner 的 Javadoc,当您调用它的 close 方法时,它会关闭流。一般来说,创建资源的代码也负责关闭它。System.in 不是由代码实例化的,而是由 VM 实例化的。因此,在这种情况下,可以安全地关闭扫描仪,忽略警告并添加注释以方便忽略它。如果需要,VM 将负责关闭它。

(题外话:“数字”这个词与其说是“数量”,不如用在一些玩家身上。英语不是我的母语(我是荷兰人),我曾经犯过完全相同的错误。


推荐