Scanner non è mai chiusa

Sto lavorando su un gioco e mi sono imbattuto in un piccolo problema con il mio scanner.
Sto diventando una perdita di risorse scanner mai chiuso.

Ma ho pensato che il mio scanner stava lavorando prima senza chiuderlo.
Ma ora non è. Qualcuno mi può aiutare qui?

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)."); 
    }
}
  • Come puoi dire che il tuo scanner non funziona più? Che atteggiamento si fa a vedere?

 

4 Replies
  1. 47

    Sto supponendo che si sta utilizzando java 7, in tal modo si ottiene un avviso del compilatore, quando non chiudere la risorsa si dovrebbe chiudere il suo scanner di solito in un blocco finally.

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

    O ancora meglio, utilizzare la nuova Provare con istruzione di risorsa:

    try(Scanner scanner = new Scanner(System.in)){
        //rest of your code
    }
    • Dovrebbe new Scanner(System.in) essere circondato con try-catch blocco?
    • non necessariamente. ma è una buona pratica per chiudere le vostre risorse all’interno di un blocco finally.
    • Grazie, davvero come la Prova con istruzione di risorsa, funziona come un fascino!
    • btw, voglio solo parlare di questo. il suo solo un avviso del compilatore che si stanno ottenendo e io sono quasi certamente sicuro che questo non sarebbe il caso di eventuali problemi come il tuo le funzioni dello scanner. il compilatore è da te dire che bisogna chiudere la risorsa, che hai aperto per evitare perdite . 🙂
    • Grazie per il testa a testa, lo scanner funzionava bene ma non mi piace l’errore 🙂
    • Perché la chiusura System.in da soli? È il lavoro della jvm in arresto.
    • Perché abbiamo bisogno di chiudere Scanner ? Cosa si intende per “perdita di risorse” ?
    • Allora perché eclipse continuare a lanciare l’avvertimento ? Mi chiedo se sto facendo qualcosa di sbagliato.
    • Funziona come un fascino grazie.

  2. 5

    Secondo il Javadoc di Scanner, chiude il flusso quando si chiama il metodo close. In generale, il codice che crea una risorsa è anche responsabile per la chiusura. Sistema.non è stato istanziato da dal tuo codice, ma dalla VM. Quindi in questo caso è sicuro di non chiudere lo Scanner, è possibile ignorare l’avviso e aggiungere un commento, perché si ignora. Il VM si prenderà cura di chiusura, se necessario.

    (Offtopic: invece di “quantità”, la parola “numero” sarebbe più appropriato da utilizzare per un numero di giocatori. L’inglese non è la mia lingua madre (io sono olandese) e che ho utilizzato per fare esattamente lo stesso errore.)

  3. 1

    Qui è un po ‘ meglio l’utilizzo di java per scanner

    try(Scanner sc = new Scanner(System.in)) {
    
        //Use sc as you need
    
    } catch (Exception e) {
    
            // handle exception
    
    }
  4. 0

    Provare questo

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

Lascia un commento