Java, comment puis-je éviter “n'aurait pas été initialisé”
J'ai une table de hachage appelé examList
permettant de stocker des notes obtenues à l'examen de chaque cours, un étudiant a pris. La clé de cette table de hachage est courseID
, et la valeur est une liste de tableau gradeList
qui contient toutes les notes d'un étudiant a obtenu dans un cours. Le problème est comme suit:
//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.");
}
}
Comme vous pouvez le voir j'ai d'abord définir gradeList, mais je n'ai pas encore l'initialiser. Sous SI je vérifier si l'étudiant a déjà fait cet examen avant de. Si il n'a pas alors la nouvelle entrée est créée pour table de hachage, et gradeList est enfin initialisé. En vertu de l'AUTRE (où, il est considéré qu'il ya un élément avec gradeList déjà initialisé) je viens d'ajouter un nouveau grade. Cependant, ce qui semble être le problème. Je ne peux pas le compiler car le programme suppose que gradeList n'est pas encore initialisée ici.
Alors, comment puis-je résoudre ce problème? Ou puis-je l'éviter (puisque logiquement, gradeList sera toujours initialisé sous d'AUTRE) à travers la gestion d'erreur, dont je sais peu de choses sur?
gradeList
dans le si-partie. Partout ailleurs, la liste n'est pas initialisé et vous obtiendrez une erreur. De vous extrait de code, il n'est pas clair que gradeList
est initialisé n'importe où ailleurs dans votre code. Donc quand vous dites que vous assumez gradeList
est initialisée dans l'autre, si une partie de votre code, comment est-ce fait?OriginalL'auteur vedran | 2011-11-01
Vous devez vous connecter pour publier un commentaire.
Dans votre cas, il vaut mieux faire quelque chose comme suit:
OriginalL'auteur Bhesh Gurung
initialiser gradeList lorsque vous créez la variable.
ou le mettre à null
Si la liste existe déjà avant l'appel de la méthode, vous devez passer la liste en argument de la méthode.
OriginalL'auteur Reid Mac
Attribuer
null
dans sa déclaration:OriginalL'auteur maerics
Lorsque vous déclarez la liste de tableaux, il suffit d'écrire
gradeList = null
. Ou encore mieux, pour éviter NullPointerExceptions, l'initialiser sur place, comme ceci:ArrayList<Integer> gradeList = new ArrayList<Integer>();
Dans votre méthode, gradeList jamais existe au début de la méthode, car vous êtes déclarant comme une variable locale, il est créé à chaque fois. Si vous voulez que le liste à "survivre" entre les différents appels de méthode (pour la même instance d'objet), vous devez déclarer gradeList comme un attribut, pas une variable locale
OriginalL'auteur Óscar López
Si la carte contient la clé, puis la valeur de cette clé est votre gradeList. Il suffit d'ajouter cette ligne dans
else if ( examList.containsKey(courseID)) {
:Noter que la dénomination d'une carte
examList
est assez déroutant. Pourquoi ne pasexamMap
? Notez également que vous pouvez simplement utiliserelse {
au lieu deelse if ( examList.containsKey(courseID)) {
: soit la carte contient les courseID, ou il n'en est rien; il n'y a pas d'autre possibilité.Enfin, vous aurez également à fixer la ligne suivante de code, car il n'est pas correct.
OriginalL'auteur JB Nizet