2

在一个类中,我有两种不同的方法正在使用扫描仪类。我为第一种方法创建了一个新的扫描仪对象实例,然后在第一种方法结束时将其关闭......然后在第二种方法中创建了一个对象的新实例(具有不同的名称),最终在此方法结束。

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

这是我的两种返回错误的方法...

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();
}
4

3 回答 3

6

由于两个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您还可以提高类的可测试性。

于 2013-07-12T19:28:29.477 回答
0

您应该将 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();
        }
 }

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

于 2013-07-12T19:42:22.067 回答
0

我学习 Java 的时间很短,并不真正知道自己在做什么,但这对我有用。我不知道为什么会这样,但是...

import java.util.Scanner;
public class Inputing{

    public Scanner input_scan = null;

    public static int ScanningInput() {
        int input_value = 0;
        Scanner input_scan = new Scanner(System.in);

        try {
            input_value = input_scan.nextInt();
        } catch (Exception e) {
            System.out.println("!error!");
        } finally {
            if (input_scan.equals(null)) {
                input_scan.close();
            }
        }
        return input_value;
    }

    public static int getInputA(int scan_valueA){
        scan_valueA = (ScanningInput());
        return scan_valueA;
    }

        public static int getInputB(int scan_valueB){
        scan_valueB = (ScanningInput());
        return scan_valueB;
    }
}

// then call it with another class

public class MainClass{

    public static void main(String[] args) {

        int variableA = 0; 
        variableA = Inputing.getInputA(variableA);

        int variableB = 0;
        variableA = Inputing.getInputC(variableB);
    }

}

对于任何错误,我深表歉意,并希望得到指导。我是一个完整的新手,但是在弄乱了这段代码一段时间之后,这似乎没有产生任何警告并返回我正在寻找的结果。

于 2020-03-24T20:08:43.117 回答