4

これは学校の課題の質問なので、そのようにしています。

とにかく、メインメソッドで Stdin を使用してスキャナーを作成し (Scanner stdin = new Scanner(System.in); は行です)、プログラムの実行時に指定された txt からデータを読み取ります。この Scanner はメインでは期待どおりに動作しますが、引数として Scanner を持つカスタム クラスで使用する必要があります。

    public PhDCandidate(Scanner stdin)
    { 

    name = stdin.nextLine();
    System.out.println(name); //THIS NEVER RUNS
    preliminaryExams = new Exam[getNumberOfExams()];

    for(int i = 0; i <= getNumberOfExams(); i++)
    {
        preliminaryExams[i] = new Exam(stdin.nextLine(), stdin.nextDouble());
    }
    System.out.print("alfkj");
   }

この時点で、スキャナの呼び出しはプログラムを終了するだけで、例外やエラーはスローされません。.next() の呼び出しのみが機能します。私はプログラムを動作させることができましたが、それはハッキーであり、何が起こっているのか本当に理解できません. 非常に単純な概念が欠けていると思いますが、迷っています。どんな助けでも大歓迎です。

4

3 に答える 3

3

コンストラクターを呼び出す前に、閉じて再初期化していないことを確認してください。Scanner stdinつまり、以下のようなことをしている場合は、それが問題であると思われます。

        Scanner stdin = new Scanner(System.in);
        .........
        stdin.close(); //This will close your input stream(System.in) as well  

        .....
        .....

        stdin = new Scanner(System.in);
        PhDCandidate phDCandidate = new PhDCandidate(stdin);

stdinSystem.in入力ストリームがすでに閉じられているため、コンストラクター内では何も読み取られません。

于 2012-10-31T20:39:26.380 に答える
1

PhDCandidate クラスに set Name メソッドを追加します。このようにして、メイン メソッド内に PhDCandidate オブジェクトを作成し、名前を出力したり、メインから何でも実行したりできます。

public static void main(String[] args) {

    PhDCandidate c = new PhDCandidate();
    c.setName(stdin.nextLine());
}
于 2012-10-31T20:37:09.680 に答える
1

あなたのコードは私にとってはうまくいきます。メインでスキャナーを作成した後、それを引数として渡します。

 public Test(Scanner stdin)
        { 
System.out.println("enter something");
        name = stdin.nextLine();
        System.out.println(name); //THIS NEVER RUNS


        System.out.print("alfkj");
       }
    public  static void main(String...args)throws SQLException {
        new Test(new Scanner(System.in));
}

output: enter something
        xyzabc
        alfkj
于 2012-10-31T20:33:36.957 に答える