【问题标题】:Using String Array in HashMap, Java在 HashMap、Java 中使用字符串数组
【发布时间】:2012-04-11 12:40:28
【问题描述】:

我有一个包含多个字符串数组的哈希图。我正在尝试在哈希图的一个数组中输出每个元素,但是我似乎总是得到

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


}

我怎样才能阻止这个问题?

【问题讨论】:

    标签: java arrays jvm hashmap


    【解决方案1】:
    1. 您在 TestApp() 内重新定义了一个新的局部变量 subjects,它与 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您两次声明subjects。一个作为类成员,它为空,一个作为构造函数中的局部变量。您的构造函数应该从以下行开始以使用类成员:

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

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

      【讨论】:

        【解决方案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);
                }
            }
        
        }
        

        另外,由于您似乎是一名学生,因此通常认为在可能的情况下对接口进行编程是一种很好的做法。即,当没有理由需要为特定类型的 Map 时,我们更愿意在 HashMap 上声明 private static Map&lt;String, String[]&gt; subjects;

        【讨论】:

        • 我不知道存在“静态块”。这真的很酷。
        【解决方案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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-14
          • 1970-01-01
          相关资源
          最近更新 更多