In a single class I have two different methods who are using the scanner class. I created a new instance of scanner object for the first method, then closed it at the end of the first method...then created a new instance of an object (with a different name) in the second method to finally close it at the end of this method.
Unless I open the scanner once and close it once it won't work and return an error. The double use of the scanner class doesn't seem to work. What am I doing wrong?
Here are my two methods which return an error...
public void GameSetup(){
//intro to the program and what the user should expect to do
Scanner in = new Scanner(System.in);
out.println("Let's play a little baseball game. Type down the scores for each team at the end of each inning to determine the winner!" +
"\nFor each inning enter the score for the first team, hit space and enter the score for the second team.\nFirst, let's enter the team names:");
//Console will ask for the team names.
out.println("What is the name of team 1?");
team1Name = in.nextLine(); //Read team name 1
out.println("What is the name of team 2?");
team2Name = in.nextLine(); //Read team name 2
in.close();//close the scanner
}
public void GetScores() {//this method will make the console ask for the scores for each innings
Scanner input = new Scanner(System.in);
out.println("What is the score at the end of 1st inning? (team 1 score <space> team 2 score)"); //The console asks to enter scores for each team
team1Array[0] = input.nextInt(); //Read an integer for team 1 inning 1
team2Array[0] = input.nextInt(); //Read an integer for team 2 inning 1
out.println("What is the score at the end of 2nd inning? (team 1 score <space> team 2 score)");
input.close();
}
As both
Scanner
instances use the sameInputStream
source, when the first instance is closed, then the second instance is unable to read from theInputStream
resulting in aNoSuchElementException
.There's no need to close the
Scanner
instances unless you wish it to fail for subsequent reads. You could use a single instance ofScanner
to avoid the overhead of 2 instances. By not closing theScanner
you also improve testability of the class.You should declare Scanner as a class variable because you're already closing the scanner in the method gameSetup(). example:
Or else what you can do is declare a scanner in each method and close in scope.