Java, как я могу избежать "не инициализирован" - PullRequest
4 голосов
/ 01 ноября 2011

У меня есть HashMap под названием examList, в котором хранятся оценки по экзаменам для каждого курса, пройденного студентом.Ключ этого хэш-карты courseID, а значение - список массивов gradeList, который содержит все оценки, полученные студентом за курс.Проблема заключается в следующем:

// Add a new course exam listing
// where each course exam can be done a max 5 times
protected void addExam(String courseID, int grade) {
    ArrayList<Integer> gradeList;
    // First check if course is in the list, if not add it
    if ( !examList.containsKey(courseID) ) {
        gradeList = new ArrayList<Integer>();
        examList.put(courseID, gradeList);
        examList.get(gradeList.add(grade));
    // If course is already on the list, check if max number of attempts has been reached, if not add new grade
    } else if ( examList.containsKey(courseID)) {
        if ( gradeList.size() <= 5 )            // THIS IS WHERE ERROR OCCURES
            examList.get(gradeList.add(grade)); // HERE ALSO
        else
            System.out.println("Maxim number of attempts has been reached.");
    }
}

Как видите, я сначала определяю gradeList, но пока не инициализирую его.В разделе ЕСЛИ я проверяю, сдал ли студент этот экзамен раньше.Если он этого не сделал, то для hashmap создается новая запись, и gradeList наконец инициализируется.В ELSE (где считается, что элемент с gradeList уже инициализирован) я просто добавляю новую оценку.Однако это, похоже, проблема.Я не могу скомпилировать его, потому что программа предполагает, что gradeList здесь еще не инициализирован.Итак, как я могу это исправить?Или я могу избежать этого (поскольку, по логике вещей, gradeList всегда будет инициализироваться в ELSE) посредством обработки ошибок, о которой я мало знаю?

Ответы [ 5 ]

8 голосов
/ 01 ноября 2011
ArrayList<Integer> gradeList = null;

В вашем случае лучше сделать следующее:

List<Integer> gradeList = examList.get(courseID);
if(gradeList == null) {
    gradeList = new ArrayList<Integer>();
    //... do something
} else {
    //... do something else
}
3 голосов
/ 01 ноября 2011

просто инициализируйте gradeList при создании переменной.

ArrayList<Integer> gradeList = new ArrayList<Integer>();

или установите его в null

ArrayList<Integer> gradeList = null;
2 голосов
/ 01 ноября 2011

Назначьте null в своем объявлении:

ArrayList<Integer> gradeList = null;
1 голос
/ 01 ноября 2011

Если карта содержит ключ, то значением этого ключа является ваш gradeList.Просто добавьте эту строку под else if ( examList.containsKey(courseID)) {:

gradeList = examList.get(courseID);

Обратите внимание, что присвоение карты examList довольно запутанноПочему не examMap?Также обратите внимание, что вы можете просто использовать else { вместо else if ( examList.containsKey(courseID)) {: либо карта содержит идентификатор курса, либо его нет;другой возможности нет.Наконец, вам также придется исправить следующую строку кода, потому что это не правильно.

1 голос
/ 01 ноября 2011

Когда вы объявляете ArrayList, просто напишите gradeList = null.Или, что еще лучше, чтобы избежать исключений NullPointerException, инициализируйте его на месте, например: ArrayList<Integer> gradeList = new ArrayList<Integer>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...