29

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

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

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)."); 
    }
}
4

4 回答 4

53

我假设您使用的是 java 7,因此您会收到编译器警告,当您不关闭资源时,您通常应该在 finally 块中关闭您的扫描仪。

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
}
于 2013-03-25T11:21:38.147 回答
6

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

(题外话:用“数字”这个词代替“数量”更适合一些玩家。英语不是我的母语(我是荷兰语),我曾经犯过完全相同的错误。)

于 2014-11-28T09:42:52.947 回答
1

这是java用于扫描仪的一些更好的用法

try(Scanner sc = new Scanner(System.in)) {

    //Use sc as you need

} catch (Exception e) {

        //  handle exception

}
于 2017-07-22T07:30:46.930 回答
0

尝试这个

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));
if(scanner != null) {
    scanner.close();
}
System.out.println("You've selected " + amountOfPlayers+" player(s).");
于 2013-03-25T11:27:04.463 回答