扫描仪方法打开和关闭两次

在单个类中,我有两种使用扫描类的方法。 我为第一个方法创建了一个新的scanner对象实例,然后在第一个方法的末尾关闭它…然后在第二个方法中创建一个对象的新实例(具有不同的名称),最后在这个方法结束了。

除非我打开扫描仪一次并关闭它一旦它将无法工作并返回错误。 扫描仪类的双重用途似乎不起作用。 我究竟做错了什么?

这是我的两个返回错误的方法…

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  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  team 2 score)"); input.close(); } 

您应该将Scanner声明为类变量,因为您已经在方法gameSetup()中关闭了扫描程序。 例:

  public class Game{ Scanner in = new Scanner(System.in); public void GameSetup(){ //insert code here DO NOT CLOSE SCANNER.... } public void GetScores() { //your code here......... in.close(); } } 

或者你可以做的是在每个方法中声明一个扫描仪并在范围内关闭。

由于两个Scanner实例都使用相同的InputStream源,因此当第一个实例关闭时,第二个实例无法从InputStream读取,从而导致NoSuchElementException

 public class GameClass { private final Scanner input; public GameClass() { input = new Scanner(System.in); } public void getScores() { team1Array[0] = input.nextInt(); ... } } 

除非您希望后续读取失败,否则无需关闭Scanner实例。 您可以使用单个Scanner实例来避免2个实例的开销。 通过不关闭Scanner您还可以提高课程的可测试性。