Использование String Array в HashMap, Java - PullRequest
6 голосов
/ 28 марта 2012

У меня есть 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 ]

14 голосов
/ 28 марта 2012
  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);
    }
}
5 голосов
/ 28 марта 2012

Чтобы настроить карту на доступность статическим методом, вам нужно инициализировать ее в статическом блоке. Создание его в конструкторе ничего не доказывает, 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);
        }
    }

}

Кроме того, поскольку вы кажетесь студентом, обычно считается хорошей практикой программировать интерфейсы, когда это возможно. то есть мы бы предпочли объявить private static Map<String, String[]> subjects; через HashMap, когда нет причин, по которым это должен быть конкретный тип Map

2 голосов
/ 28 марта 2012

Вы объявляете subjects дважды.Один как член класса, который является нулем, и один как локальная переменная в вашем конструкторе.Ваш конструктор начнёт со следующей строки для работы с членом класса:

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

И вам нужно создать новый TestApp экземпляр в main перед циклом.

0 голосов
/ 28 марта 2012

Вы не создали 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
}
...