Java,我怎么能避免“可能没有被初始化”

时间:2011-11-01 16:48:30

标签: java arraylist initialization

我有一个名为examList的HashMap,它存储了学生每门课程的考试成绩。此hashmap的关键是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,但我还没有初始化它。在IF下,我检查学生之前是否已完成此考试。如果他没有为hashmap创建新条目,则最终初始化gradeList。在ELSE下(其中,认为有一个已经初始化了gradeList的元素)我只是添加新的等级。但是,这似乎是个问题。我无法编译它,因为程序假定gradeList尚未在此处初始化。 那么,我该如何解决这个问题呢?或者我可以通过错误处理来避免它(从逻辑上讲,gradeList将始终在ELSE下初始化),我对此几乎一无所知?

5 个答案:

答案 0 :(得分:8)

ArrayList<Integer> gradeList = null;

在您的情况下,最好采取以下措施:

List<Integer> gradeList = examList.get(courseID);
if(gradeList == null) {
    gradeList = new ArrayList<Integer>();
    //... do something
} else {
    //... do something else
}

答案 1 :(得分:3)

在创建变量时初始化gradeList。

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

或将其设为null

ArrayList<Integer> gradeList = null;

答案 2 :(得分:2)

在声明中指定null

ArrayList<Integer> gradeList = null;

答案 3 :(得分:1)

声明ArrayList时,只需编写gradeList = null即可。或者甚至更好,为了避免NullPointerExceptions,在现场初始化它,如下所示:ArrayList<Integer> gradeList = new ArrayList<Integer>();

答案 4 :(得分:1)

如果地图包含密钥,则此密钥的值为gradeList。只需在else if ( examList.containsKey(courseID)) {下添加此行:

gradeList = examList.get(courseID);

请注意,命名地图examList非常令人困惑。为什么不examMap?另请注意,您可以使用else {代替else if ( examList.containsKey(courseID)) {:地图包含courseID,或者不包含;没有其他可能性。 最后,您还必须修复下一行代码,因为它不正确。