2

データファイルを読み込むだけの演習を始めています。プログラムを実行すると、データファイルが読み取られますが、何らかの理由で「NoSuchElementException」が発生し、出力が想定どおりにフォーマットされていません。何が起こっているかは次のとおりです。

次のような単純なデータ ファイルを作成しました。

Barry Burd
Author
5000.00
Harriet Ritter
Captain
7000.00
Ryan Christman
CEO
10000.00

その後、単純な「ゲッター」および「セッター」プログラムを作成しました (コードは以下にあります)。

import static java.lang.System.out;

  //This class defines what it means to be an employee

public class Employee {

  private String name;
  private String jobTitle;

  public void setName(String nameIn) {
    name = nameIn;
  }

  public String getName() {
    return name;
  }

  public void setJobTitle(String jobTitleIn) {
    jobTitle = jobTitleIn;
  }

  public String getJobTitle() {
    return jobTitle;
  }

  /*The following method provides the method for writing a paycheck*/

  public void cutCheck(double amountPaid)   {
    out.printf("Pay to the order of %s ", name);
    out.printf("(%s) ***$", jobTitle);
    out.printf("%,.2f\n", amountPaid);
  }

}

簡単です。 次に、実際にこれを使用するプログラムを作成しました (以下のコード)。

import java.util.Scanner;
import java.io.File;
import java.io.IOException;

public class DoPayroll {

  public static void main(String[] args) throws IOException {
    Scanner diskScanner = new Scanner(new File("EmployeeInfo.txt"));

    for (int empNum = 1; empNum <= 3; empNum++) {
      payOneEmployee(diskScanner);
    }
  }

  static void payOneEmployee(Scanner aScanner) {
    Employee anEmployee = new Employee();

    anEmployee.setName(aScanner.nextLine());
    anEmployee.setJobTitle(aScanner.nextLine());
    anEmployee.cutCheck(aScanner.nextDouble());
    aScanner.nextLine();
  }
}

ここに私の出力があります:

Pay to the order of Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1516)
    at DoPayroll.payOneEmployee(DoPayroll.java:25)
    at DoPayroll.main(DoPayroll.java:14)
 Barry Burd ( Author) ***$5,000.00
Pay to the order of  Harriet Ritter ( Captain) ***$7,000.00
Pay to the order of  Ryan Christman ( CEO) ***$10,000.00

EDIT 問題を見つけましたが、わかりません笑。どうやら、データ ファイルの末尾に空白行を追加する必要があったようです....なぜ??

4

5 に答える 5

2

電話をかけるたびに、最後に電話をかけpayOneEmployee()ます。aScanner.nextLine()これには、最後に呼び出したとき(ループ内empNumで3に等しいとき)が含まれます。ファイルにfor新しい行()がなくても、まだ電話をかけている場合は、そのような要素がなかったために受け取りました。これは、ファイルの最後の要素が文字であるためです。\nnextLine()NoSuchElementException0

将来これを回避するために、簡単なチェッカーを追加できます。はすでに実装されていますjava.util.ScannerhasNextLine()したがって、簡単に変更できます

aScanner.nextLine();

... に ...

if(aScanner.hasNextLine()) aScanner.nextLine();
于 2012-07-18T19:51:04.917 に答える
2

私は問題を見つけましたが、私はそれを理解していません笑。どうやら、データ ファイルの末尾に空白行を追加する必要があったようです....なぜ??

Scanner入力ファイルの給与の後に改行があることを伝えているからです。ただし、最後のエントリにはキャリッジ リターンがなかったため、プログラミング エラーが発生したと判断され、未チェックの例外がスローされました。

次のようにコードで問題を解決できます。

static void payOneEmployee(Scanner aScanner) {
    Employee anEmployee = new Employee();

    anEmployee.setName(aScanner.nextLine());
    anEmployee.setJobTitle(aScanner.nextLine());
    anEmployee.cutCheck(aScanner.nextDouble());
    if (aScanner.hasNextLine()) {
        aScanner.nextLine();
    }
}
于 2012-07-18T19:48:47.010 に答える
1

ファイルの終わりに達したと思います。while ループを追加する必要があります。

while(aScanner.hasNext()) {
    ...
}

これにより、スキャナがファイルの末尾を超えることがなくなります。

于 2012-07-18T19:47:33.080 に答える
0

aScanner.nextLine()を呼び出す前に、hasNextLineを呼び出す必要があります。ファイルの最後にある行がない行を読み込もうとしています。

于 2012-07-18T19:49:24.030 に答える
0

ここでの問題はaScanner.nextLine()、改行文字 ('\n') を消費しようとしたときに、ファイルが文字 '0' で終わったことです。

ここで興味深いのは、例外が発生した場所です。cutCheck()初刷の途中らしい。ここでの私の推測では、出力ストリームの IO バッファリングと非同期性に関係しているということです。out.printf()エラーメッセージがstderrに表示されている間、stdoutです。そのため、そこでの奇妙な動作を説明できます。

for ループに a を入れるとThread.sleep()、印刷の問題が解消される可能性があります (ただし、これは単なる好奇心であり、コードの修正などではありません)。

于 2012-07-18T19:47:40.537 に答える