在HashMap中使用String Array,Java

时间:2012-03-27 22:40:16

标签: java arrays jvm hashmap

我有一个包含多个字符串数组的hashmap。我试图输出hashmap的一个数组中的每个元素,但我似乎总是得到

java.lang.NullPointerException

这是我的代码,

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


}

如何解决此问题?

4 个答案:

答案 0 :(得分:14)

  1. 您已在subjects内重新定义了与TestApp()变量无关的新本地变量private static
  2. 您在哪里实例化TestApp()?该代码首先没有运行。
  3. 要么在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);
        }
    }
    

答案 1 :(得分:5)

要将地图设置为可从静态方法获得,您需要在静态块中初始化它。在构造函数中构建它不会证明什么,Java在调用main之前不会运行该构造函数。

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;

答案 2 :(得分:2)

您声明subjects两次。一个作为类成员,它在构造函数中为null,一个作为局部变量。您的构造函数使用以下行开始与类成员一起使用:

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

您需要在循环之前在TestApp中创建一个新的main实例。

答案 3 :(得分:0)

您尚未在TestApp方法中创建main对象引用。

public static void main(String[] args) {
    ta = new TestApp();
    for (String s : ta.subjects.get("biology")) {
        // do your thing
    }
}

此外,您已在构造函数中重新声明了主题。使用:

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