在HashMap中使用String Array,Java

use*_*188 6 java arrays jvm hashmap

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

java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

这是我的代码,

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


}
Run Code Online (Sandbox Code Playgroud)

我怎么能阻止这个问题?

mel*_*okb 14

  1. 你重新定义一个新的局部变量subjects里面TestApp()是无关的private static变量.
  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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Aff*_*ffe 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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

另外,由于您似乎是一名学生,因此通常认为在可能的情况下对接口进行编程是一种很好的做法.也就是说,private static Map<String, String[]> subjects;当没有必要成为特定类型的Map时,我们宁愿在HashMap 上声明