在HashMap中使用字符串数组,Java

在HashMap中使用字符串数组,Java,java,arrays,jvm,hashmap,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<Str

我有一个包含多个字符串数组的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);
        }
    }


}
import java.util.HashMap;
公共类测试{
私有静态HashMap主题;
公开测试{
HashMap subjects=新建HashMap();
subjects.put(“微积分”,新字符串[]{“数学”,“逻辑”});
主题。put(“化学”,新字符串[]{“离子”,“电子”});
主题。put(“生物学”,新字符串[]{“生命”,“细菌”});
}
公共静态void main(字符串[]args){
for(字符串s:subjects.get(“生物学”)){
系统输出打印项次;
}
}
}
我怎样才能阻止这个问题

  • 您已经在
    TestApp()
    内部重新定义了一个新的局部变量
    subjects
    ,该变量与
    私有静态
    变量无关
  • 您在哪里实例化
    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);
        }
    }
    
    私有静态HashMap主题;
    公开测试{
    }
    公共静态void main(字符串[]args){
    subjects=newhashmap();
    subjects.put(“微积分”,新字符串[]{“数学”,“逻辑”});
    主题。put(“化学”,新字符串[]{“离子”,“电子”});
    主题。put(“生物学”,新字符串[]{“生命”,“细菌”});
    for(字符串s:subjects.get(“生物学”)){
    系统输出打印项次;
    }
    }
    
    您声明
    主题两次。一个作为类成员,为null,另一个作为构造函数中的局部变量。构造函数必须从以下行开始使用类成员:

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

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

    要设置从静态方法可用的映射,您需要在静态块中初始化它。在构造函数中构建它不会证明什么,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);
            }
        }
    
    }
    
    import java.util.HashMap;
    公共类测试{
    私有静态HashMap主题;
    静止的{
    subjects=newhashmap();
    subjects.put(“微积分”,新字符串[]{“数学”,“逻辑”});
    主题。put(“化学”,新字符串[]{“离子”,“电子”});
    主题。put(“生物学”,新字符串[]{“生命”,“细菌”});
    }
    公共静态void main(字符串[]args){
    for(字符串s:subjects.get(“生物学”)){
    系统输出打印项次;
    }
    }
    }
    

    另外,由于您似乎是一名学生,在可能的情况下编写接口编程通常被认为是一种良好的做法。i、 例如,我们更愿意声明
    私有静态映射主题当没有理由需要特定类型的映射时

    您没有在
    main
    方法内创建
    TestApp
    对象引用

    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
    }
    
    publictestapp(){
    subject=…//不是HashMap主题=
    //如前所述
    }
    
    我不知道“静态块”的存在。那真的很酷。