私は 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 行目までです! ですから、すぐにまた私から連絡が来るかもしれません.... 私が自分でそれを理解できるかどうかを確認する途中です。再度、感謝します。
おっと
そんなに早くない。
line
NameSurferEntry の本体で実際の文字列に初期化すると、すべてうまくいきます。
問題は、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
メッセージが再び表示され、開始した場所に戻ります。ああ!
考え?