2012-04-15 21 views
0
を理解しようとしているJava初心者

私はJavaでiTunes UスタンフォードCS106aコースをやっていて、それを愛していますが、この名前サーファープログラムで耳を傾けています。NullPointerExceptionと

私はこのコード

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

を使用する場合、私は二行目(int型endOfNameなど)の一時停止/ NullPointerExceptionが取得 "NameSurferEntry(String)を行。:16" と言うこと。

私はこのようにそれを実行しようとした場合

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

私はメッセージ「StringTokenizerは(文字列、文字列、ブール値)行:182」で懸濁/ NullPointerExceptionが取得が続くが、「ソースが見つかりません。 "

誰かが私が間違っていることについてのアイデアはありますか?助けのための

UPDATE

感謝。

NameSurferEntryは実際にはnullの値を提供する別のクラスによって呼び出されます。しかし、あなたの提案を読んだ後、私はlineをivarとして宣言しましたが、それをNameSurferEntryの本体で初期化し、それを修正しました。 (私が宣言し、イニシャルとしてlineを初期化する前に、なぜ私が初期化する場所が違いを生むのか分かりませんが、そこにあります)

次のエラーは48行までです!だから、すぐに私から再び聞こえるかもしれません....私は自分でそれを理解できるかどうかを見ています。再度、感謝します。

おっと

それほど速いです。

lineをNameSurferEntry本体の実際のStringに初期化すると、すべて正常に機能します。

問題が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の実際のファイルを提供しますので、私たちはそこに大丈夫だ、別のメソッドによって呼び出されます。)

パラメータblahNameSurferEntryに渡して、NameSurferEntryがパラメータを初期化してから、blahを失ってしまいましたか?私の衝動は方法の外のivarとしてlineを初期化することです、しかし私はNullPointerExceptionメッセージをもう一度得て、私はどこで始めました。アー!

思考?

+0

私はあなたの質問を理解していません。最後に投稿されたコードは、 'NameSurferEntry'コンストラクタがnull以外の値でのみ呼び出されることを保証します。だからすべてがうまくいくはずです...テキストの壁を小さくして、あなたの質問が本当に何であるかを明確にしてください。それが元の質問でないときは、そのままここに置き、別の質問をしてください。 –

+0

申し訳ありません。私はStackOverflowを初めて使っていて、それがどのように動作するかをまだ考えています。次回はよく分かるよ。 –

答えて

1

line引数がnullです。だから、lineindexOfStringTokenizerlineに使用してNullPointerExceptionを使用すると、lineがnullであれば、何も操作する必要はありません)で操作しようとしているときに、NullPointerExceptionが得られたのです。

+0

さて、NameSurferEntryは次のような別のクラスによって呼び出されます: –

+0

更新を行いました。しかし、基本的に答えは、皆さんが私を助けてくれたことです。今すぐ次のエラーに進みます。これは48行目までです! –

+0

@JoelDerfnerあなたを助けてくれてうれしい! :)次のエラーのために別の質問をすることをお勧めします。 SOは通常、投稿ごとに1つの質問を扱うので、次の質問のために別の投稿を開く必要があります。 – Roshnal

2

コンストラクタに引数として渡す変数lineは、nullです。

NameSurferEntryコンストラクタに電話する場合は、nullを入力しないでください。