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声明为属性,而不是局部变量