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 withresourceステートメントを使用します:

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は、必要に応じて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 に答える