有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. # 1 楼答案

    1. 您已经在TestApp()内部重新定义了一个与private static变量无关的新局部变量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. # 2 楼答案

    声明subjects两次。一个作为类成员,为null,另一个作为构造函数中的局部变量。构造函数必须从以下行开始使用类成员:

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

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

  3. # 3 楼答案

    要设置从静态方法可用的映射,需要在静态块中对其进行初始化。在构造函数中构建它不会证明什么,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);
            }
        }
    
    }
    

    另外,由于您似乎是一名学生,在可能的情况下编写接口编程通常被认为是一种良好的做法。i、 例如,如果没有理由需要将private static Map<String, String[]> subjects;声明为特定类型的映射,那么我们更愿意在HashMap上声明它

  4. # 4 楼答案

    您尚未在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
    }