我有一个名为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下初始化),我对此几乎一无所知?
答案 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,或者不包含;没有其他可能性。
最后,您还必须修复下一行代码,因为它不正确。