Java,我如何避免;可能未被初始化";

Java,我如何避免;可能未被初始化";,java,arraylist,initialization,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) { ArrayLi

我有一个名为
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.");
    }
}
List<Integer> gradeList = examList.get(courseID);
if(gradeList == null) {
    gradeList = new ArrayList<Integer>();
    //... do something
} else {
    //... do something else
}
//添加新的课程考试列表
//每次课程考试最多可进行5次
受保护的无效加法器(字符串courseID,整数级){
ArrayList成绩表;
//首先检查课程是否在列表中,如果不在,则添加它
如果(!examList.containsKey(courseID)){
等级列表=新的ArrayList();
examList.put(课程ID、成绩表);
examList.get(成绩表.add(成绩));
//如果课程已在列表中,请检查是否已达到最大尝试次数,如果未达到,请添加新成绩
}else if(示例列表containsKey(courseID)){

如果(gradeList.size()创建变量时只需初始化gradeList

ArrayList<Integer> gradeList = new ArrayList<Integer>();
ArrayList gradeList=new ArrayList();
或者将其设置为null

ArrayList<Integer> gradeList = null;
ArrayList成绩表=null;

在声明中指定
null

ArrayList<Integer> gradeList = null;
ArrayList成绩表=null;

当您声明ArrayList时,只需编写
gradeList=null
。或者更好,为了避免NullPointerException,可以当场初始化它,如下所示:
ArrayList gradeList=new ArrayList();
ArrayList gradeList=null;
在您的情况下,最好执行以下操作:

// 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.");
    }
}
List<Integer> gradeList = examList.get(courseID);
if(gradeList == null) {
    gradeList = new ArrayList<Integer>();
    //... do something
} else {
    //... do something else
}
List gradeList=examList.get(courseID);
如果(成绩表==null){
等级列表=新的ArrayList();
//…做点什么
}否则{
//…做点别的
}

如果地图包含该键,那么该键的值就是你的成绩表。只需在
下添加这一行,否则如果(examList.containsKey(courseID)){

gradeList = examList.get(courseID);
请注意,为地图命名
examList
非常混乱。为什么不
examMap
?还请注意,如果(examList.containsKey(courseID)){,您可以使用
else{
而不是
else:map包含或不包含courseID;没有其他可能性。

最后,您还必须修复下一行代码,因为它不正确。

您只在if部分初始化
gradeList
。在其他地方,该列表未初始化,您将得到一个错误。从您的代码片段中,不清楚
gradeList
是否在代码中的其他任何地方初始化。因此,当您说您假设
gradeList
在代码的else if部分初始化,这是如何完成的?好的,但是每次调用此方法时不会替换列表吗?我的意思是,如果带有gradeList的课程已经存在,并且调用了此方法,那么gradeList不是新创建的并且是空的,examList.get(gradeList.add(grade))和examList.get(gradeList.add(grade))是否将新的成绩添加到此新列表而不是旧的?如果在方法调用之前该列表已经存在,那么您应该将该列表作为方法中的参数传递。好的,但这不会在每次调用此方法时替换该列表吗?我的意思是,如果带有成绩列表的课程已经存在并且调用了此方法,则不会新建成绩列表和为空,examList.get(gradeList.add(grade))将向该新列表添加新的等级,而不是旧的等级。在方法中,等级列表从不存在于方法的开头,因为您将其声明为局部变量,所以每次都会创建它。如果您希望该列表在不同的方法调用之间“存活”(对于同一对象实例),应该将gradeList声明为属性,而不是局部变量