我有一个包含多个字符串数组的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);
}
}
}
如何解决此问题?
答案 0 :(得分:14)
subjects
内重新定义了与TestApp()
变量无关的新本地变量private static
。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);
}
}
答案 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
}