在HashMap中使用字符串数组,Java
我有一个包含多个字符串数组的hashmap。我试图输出hashmap的一个数组中的每个元素,但是我似乎总是得到在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
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主题=
//如前所述
}
我不知道“静态块”的存在。那真的很酷。