私はゲームに取り組んでいますが、スキャナーで小さな問題に遭遇しました。リソースリークスキャナーが閉じられることはありません。
しかし、スキャナーを閉じることなく、以前は機能していたと思いました。しかし、今ではありません。誰でもここで私を助けることができますか?
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).");
}
}
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
}
ScannerのJavadocによると、closeメソッドを呼び出すとストリームを閉じます。一般的に、リソースを作成するコードはリソースを閉じる役割も果たします。 System.inは、コードではなくVMによってインスタンス化されました。そのため、この場合、スキャナーを閉じずに警告を無視し、無視する理由をコメントとして追加しても安全です。 VMは必要に応じて閉じます。
(オフトピック:「amount」の代わりに、「number」という言葉が多くのプレーヤーに使用するのに適しています。英語は私の母国語ではなく(私はオランダ語です)、以前はまったく同じ間違いをしていました。)
Javaスキャナー用のより良い使用法です。
try(Scanner sc = new Scanner(System.in)) {
//Use sc as you need
} catch (Exception e) {
// handle exception
}
これを試して
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).");