2012-03-27 7 views
3

複数の文字列配列を含むハッシュマップがあります。私はHashMap、Javaでの文字列配列の使用

import java.util.HashMap; 
public class TestApp { 
    private static HashMap<String, String[]> subjects; 
    public TestApp() { 
     HashMap<String, String[]> subjects = new HashMap<String, String[]>(); 
     subjects.put("calculus",new String[] {"math","logic"}); 
     subjects.put("chemisty",new String[] {"ions","electrons"}); 
     subjects.put("biology",new String[] {"life","bacteria"}); 
    } 
    public static void main(String[] args){ 
     for(String s:subjects.get("biology")){ 
      System.out.println(s); 
     } 
    } 


} 

は私がこの問題をどのように停止することができ、しかし、私はいつもここで

java.lang.NullPointerException 

を得るように見える出力にハッシュマップのアレイのうちの1つの各要素をしようとすると、私のコードであるのですか?

答えて

11
  1. あなたはprivate static変数とは無関係なTestApp()の内側に新しいローカル変数subjectsを再定義しました。
  2. ここではTestApp()をインスタンス化していますか?そのコードは最初に実行されていません。

どちらかmain(または関連する静的関数)ですべてのコードを実行する、またはTestApp()でコードを実行し、ちょうどmainでインスタンスをインスタンス化します。例:

private static HashMap<String, String[]> subjects; 

public TestApp() { 
} 

public static void main(String[] args){ 
    subjects = new HashMap<String, String[]>(); 
    subjects.put("calculus",new String[] {"math","logic"}); 
    subjects.put("chemisty",new String[] {"ions","electrons"}); 
    subjects.put("biology",new String[] {"life","bacteria"}); 
    for(String s:subjects.get("biology")){ 
     System.out.println(s); 
    } 
} 
2

subjectsを2回宣言します。 1つは、nullであるクラスメンバーと、コンストラクタ内のローカル変数としての1つです。あなたのコンストラクタは、クラスのメンバーで動作するように以下の行で始まるshoild:

subjects = new HashMap<String, String[]>(); 

そして、あなたはあなたのループの前にmainで新しいTestAppインスタンスを作成する必要があります。

4

マップを静的メソッドから使​​用できるように設定するには、静的ブロックでマップを初期化する必要があります。それをコンストラクタでビルドすると、何も証明されません。mainを呼び出す前に、Javaはそのコンストラクタを実行しません。

import java.util.HashMap; 
public class TestApp { 
    private static HashMap<String, String[]> subjects; 

    static { 
     subjects = new HashMap<String, String[]>(); 
     subjects.put("calculus",new String[] {"math","logic"}); 
     subjects.put("chemisty",new String[] {"ions","electrons"}); 
     subjects.put("biology",new String[] {"life","bacteria"}); 
    } 

    public static void main(String[] args){ 
     for(String s:subjects.get("biology")){ 
      System.out.println(s); 
     } 
    } 

} 

また、学生のように見えるので、可能であれば、インターフェイスにプログラミングすることをお勧めします。つまり、特定の種類のマップである必要がない場合、HashMapにprivate static Map<String, String[]> subjects;を宣言することをお勧めします。

+1

"静的ブロック"が存在することはわかりませんでした。かっこいい。 – Whymarrh

0

mainメソッド内にTestAppオブジェクトリファレンスを作成していません。

また、コンストラクタ内に再宣言されたサブジェクトがあります。使用:

public TestApp() { 
    subject = ... // not HashMap<String, String[]> subjects = 
    // and so on as before 
} 
関連する問題