studio programacion móviles ejemplo desarrollo curso aplicaciones java java.util.scanner resource-leak

java - móviles - manual de programacion android pdf



El escáner nunca está cerrado (4)

Aquí hay un mejor uso de Java para el escáner.

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

Estoy trabajando en un juego y encontré un pequeño problema con mi escáner. Estoy recibiendo un escáner de fugas de recursos nunca cerrado.

Pero pensé que mi escáner estaba funcionando antes sin cerrarlo. Pero ahora no lo es. ¿Alguien puede ayudarme aquí?

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


De acuerdo con el Javadoc de Escáner, cierra la secuencia cuando llama al método close. En términos generales, el código que crea un recurso también es responsable de cerrarlo. System.in no fue instanciado por su código, sino por la máquina virtual. Entonces, en este caso, es seguro no cerrar el escáner, ignorar la advertencia y agregar un comentario por qué lo ignoras. El VM se encargará de cerrarlo si es necesario.

(Offtopic: en lugar de "cantidad", la palabra "número" sería más apropiada para un número de jugadores. El inglés no es mi idioma nativo (soy holandés) y solía cometer exactamente el mismo error.)


Prueba esto

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


Supongo que está utilizando Java 7, por lo tanto, aparece una advertencia del compilador. Cuando no cierre el recurso, debería cerrar el escáner generalmente en un bloque final.

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

O incluso mejor: use la nueva declaración Try with resource :

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