Scanner is never closed
I'm working on a game and I came across a little problem with my scanner. I'm getting a resource leak scanner never closed.
But I thought my scanner was working before without closing it. But now it ain't. Anyone can help me out here?
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)."); } }
14 Answers
I am assuming you are using java 7, thus you get a compiler warning, when you don't close the resource you should close your scanner usually in a finally block.
Scanner scanner = null; try { scanner = new Scanner(System.in); //rest of the code } finally { if(scanner!=null) scanner.close(); }
Or even better: use the new Try with resource statement:
try(Scanner scanner = new Scanner(System.in)){ //rest of your code }
9According to the Javadoc of Scanner, it closes the stream when you call it's close method. Generally speaking, the code that creates a resource is also responsible for closing it. System.in was not instantiated by by your code, but by the VM. So in this case it's safe to not close the Scanner, ignore the warning and add a comment why you ignore it. The VM will take care of closing it if needed.
(Offtopic: instead of "amount", the word "number" would be more appropriate to use for a number of players. English is not my native language (I'm Dutch) and I used to make exactly the same mistake.)
Here is some better usage of java for scanner
try(Scanner sc = new Scanner(System.in)) { //Use sc as you need } catch (Exception e) { // handle exception }
Try this
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).");
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoaG5uYWiDc4KOrJqapp6av2610malnq6Vp3qkuM6snJ0%3D