web-dev-qa-db-ja.com

スキャナーが閉じられない

私はゲームに取り組んでいますが、スキャナーで小さな問題に遭遇しました。リソースリークスキャナーが閉じられることはありません。

しかし、スキャナーを閉じることなく、以前は機能していたと思いました。しかし、今ではありません。誰でもここで私を助けることができますか?

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

Java 7を使用しているため、コンパイラの警告が表示されます。リソースを閉じない場合、通常はfinallyブロックでスキャナーを閉じる必要があります。

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

または、さらに良い方法:新しい リソースステートメントで試してください

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

ScannerのJavadocによると、closeメソッドを呼び出すとストリームを閉じます。一般的に、リソースを作成するコードはリソースを閉じる役割も果たします。 System.inは、コードではなくVMによってインスタンス化されました。そのため、この場合、スキャナーを閉じずに警告を無視し、無視する理由をコメントとして追加しても安全です。 VMは必要に応じて閉じます。

(オフトピック:「amount」の代わりに、「number」という言葉が多くのプレーヤーに使用するのに適しています。英語は私の母国語ではなく(私はオランダ語です)、以前はまったく同じ間違いをしていました。)

5
Henno Vermeulen

Javaスキャナー用のより良い使用法です。

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

    //Use sc as you need

} catch (Exception e) {

        //  handle exception

}
1
Dev4World

これを試して

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).");
0
tmwanik