0

私は Java で iTunes U Stanford CS106a コースを受講していて、とても気に入っていますが、この Name Surfer プログラムについては耳を傾けていません。

このコードを使用すると

public NameSurferEntry(String line) {
  int endOfName = line.indexOf(" ");
  name = line.substring(0,endOfName);
  String newLine = line.substring(endOfName+1);
  StringTokenizer tokenizer = new StringTokenizer(newLine);

  if (tokenizer.hasMoreTokens()) {
    name = tokenizer.nextToken();
  }

  for (int i = 0; tokenizer.hasMoreTokens(); i++) {
    array[i] = Integer.parseInt(tokenizer.nextToken());
  }
}

"NameSurferEntry.(String) line: 16" という 2 行目 (int endOfName など) で Suspended/NullPointerException が発生します。

このようにしようとすると:

public NameSurferEntry(String line) {
  StringTokenizer tokenizer = new StringTokenizer(line);
  name = tokenizer.nextToken();

  for (int i = 0; tokenizer.hasMoreTokens(); i++) {
    array[i] = Integer.parseInt(tokenizer.nextToken());
  }
}

Suspended/NullPointerException が発生し、「StringTokenizer.(String, String, boolean) line: 182」というメッセージに続いて「Source not found.」というメッセージが表示されます。

私が間違っていることについて誰かが何か考えを持っていますか?

アップデート

助けてくれてありがとう。

NameSurferEntry は、実際には の値を提供する別のクラスによって呼び出されますnull。しかし、あなたの提案を読んだ後、私は ivar として宣言lineしましたが、NameSurferEntry の本体で初期化しました。これで修正されました。(以前はline、ivar として宣言と初期化の両方を行っていました。初期化する場所によって違いが生じる理由はわかりませんが、違いはあります。)

次のエラーは 48 行目までです! ですから、すぐにまた私から連絡が来るかもしれません.... 私が自分でそれを理解できるかどうかを確認する途中です。再度、感謝します。

おっと

そんなに早くない。

lineNameSurferEntry の本体で実際の文字列に初期化すると、すべてうまくいきます。

問題は、NameSurferEntry が別のメソッドによって呼び出されることです。

public NameSurferDataBase(String filename) {
  try {
    BufferedReader br = new BufferedReader(new FileReader(filename));

    while (true) {
      String blah = br.readLine();

      if (blah == null) {
        break;
      }

      NameSurferEntry entry = new NameSurferEntry(blah);
      hmap.put(entry.getName(), entry);
    }
    br.close();
  }
  catch (IOException ex) {
    throw new ErrorException(ex);           
  }
}

(このメソッドは、 の実際のファイルを提供する別のメソッドによって呼び出されるfilenameので、問題ありません。)

blahしかし、パラメータをに渡し、そのパラメータを初期化するNameSurferEntryと、NameSurferEntryが失われblahますよね? 私の衝動はline、メソッドの外で ivar として初期化することですが、NullPointerExceptionメッセージが再び表示され、開始した場所に戻ります。ああ!

考え?

4

2 に答える 2

2

lineコンストラクターに引数として与える変数はnull.

コンストラクターnullを呼び出す場合は、 not を入力してください。NameSurferEntry

于 2012-04-15T05:36:32.247 に答える
1

あなたのline主張は無効です。そのためNullPointerException、操作しようとしてしばらく時間がかかりますline( indexOfand StringTokenizeronlineを使用すると、NullPointerExceptionif lineis null が発生します。操作するものは何もありません)。

于 2012-04-15T05:41:28.930 に答える