web-dev-qa-db-fra.com

Le scanner n'est jamais fermé

Je travaille sur un jeu et je suis tombé sur un petit problème avec mon scanner. Je reçois un scanner de fuite de ressources jamais fermé.

Mais je pensais que mon scanner fonctionnait auparavant sans le fermer. Mais maintenant ce n'est pas. Quelqu'un peut m'aider ici?

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

Je suppose que vous utilisez Java 7, vous obtenez donc un avertissement du compilateur. Lorsque vous ne fermez pas la ressource, vous devez fermer votre scanneur généralement dans un bloc finally.

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

Ou encore mieux: utilisez le nouveau Essayez avec l'instruction de ressource :

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

Selon la Javadoc de Scanner, il ferme le flux lorsque vous appelez sa méthode close. De manière générale, le code qui crée une ressource est également responsable de sa fermeture. System.in n'a pas été instancié par votre code, mais par la machine virtuelle. Dans ce cas, il est prudent de ne pas fermer le scanner, d'ignorer l'avertissement et d'ajouter un commentaire expliquant pourquoi vous l'ignorez. Le VM se chargera de le fermer si nécessaire.

(Offtopic: au lieu de "amount", le mot "number" serait plus approprié pour un certain nombre de joueurs. L'anglais n'est pas ma langue maternelle (je suis néerlandais) et je faisais exactement la même erreur.)

5
Henno Vermeulen

Voici une meilleure utilisation de Java pour scanner

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

    //Use sc as you need

} catch (Exception e) {

        //  handle exception

}
1
Dev4World

Essaye ça

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