Java pour chaque boucle de jeter NullPointException
La suite de java, le secteur du résultat d'un NullPointException, depuis la liste des variables est nulle, ce qui est de la passer à la boucle for-each.
List<> arr = null;
for (Object o : arr) {
System.out.println("ln "+o);
}
Je pense que for (Object o : arr){ }
est un équivalent à
for (int i = 0; i < arr.length; i++) { }
et/ou
for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){
type var = iter.next();
}
Dans les deux cas, arr est null cause arr.longueur ou arr.iterator() renvoie une NullPointException
Je suis juste curieux de savoir la raison pour laquelle for (Object o : arr){ }
n'est PAS de traduire des
if (arr!=null){
for (int i = 0; i < arr.length; i++) {
}
}
and
if (arr!=null){
for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){
type var = iter.next();
}
}
Inclure arr!=nulle expression pourrait réduire code de nidification.
Si vous savez que
Je ne vois pas une raison de vouloir effectuer une itération sur un connu null liste, bien que. Pourquoi un null case à être à l'initiative renforcée pour la boucle, par opposition à la liste tout simplement jamais être null avant de l'itération?
J'avais supposé que le "connu null liste" était juste pour expliquer le comportement de la question
arr
n'est pas null
déjà, ne serait-il pas passer par une inutile supplémentaire null
vérifier? Je suppose que c'est aucun.Je ne vois pas une raison de vouloir effectuer une itération sur un connu null liste, bien que. Pourquoi un null case à être à l'initiative renforcée pour la boucle, par opposition à la liste tout simplement jamais être null avant de l'itération?
J'avais supposé que le "connu null liste" était juste pour expliquer le comportement de la question
OriginalL'auteur Linlin | 2013-04-28
Vous devez vous connecter pour publier un commentaire.
Je vois les raisons suivantes, bien que je n'ai aucune idée si quelqu'un a pensé à ce sujet, quand il a été mis en œuvre, et quelles sont les vraies raisons de la ont été.
Comme vous l'avez démontré le comportement actuel de l'(:)-boucle est très facile à comprendre. L'autre comportement n'est pas
Elle serait la seule chose que du java univers se comporter de cette façon.
Il ne serait pas l'équivalent de la simple boucle for de sorte que la migration entre les deux serait effectivement de ne pas être équivalent
Utiliser la valeur null est une mauvaise habitude que de toute façon, de sorte que les Npe sont une belle manière de dire au développeur ", vous F***ed up, nettoyer votre mess" avec la proposition de comportement que le problème serait juste caché.
Que si vous voulez faire autre chose avec le tableau avant ou après la boucle ... maintenant vous devez le nul de vérifier deux fois dans votre code.
OriginalL'auteur Jens Schauder
Pour répondre à ta première question: non, ces trois boucles ne sont pas équivalentes. Deuxièmement, il n'est pas null vérifier pour être trouvé dans ces boucles; il n'y a pas de sens d'essayer de faire une itération sur ce qui n'existe pas.
Supposons que nous avons la classe suivante:
Nous allons le décomposer en ses bytecode et voir si il n'y a aucune différence entre ces boucles.
1: meilleur Pour vs Itérateur
Voici le pseudo-code pour le renforcement de la boucle for.
Ci-dessous c'est le pseudo-code pour l'itérateur.
En fin de compte, il ne ressemble qu'ils font des choses similaires. Ils utilisent la même interface. Il y a une variation que l'amélioration de la boucle for est à l'aide de deux variables pour la valeur actuelle (
i
) et le curseur pour le reste de la liste (i$
), alors que l'itérateur doit seulement le curseur à invoquer.next()
.Similaire, mais pas tout à fait la même.
2. Amélioré Pour vs pour-Boucle
Nous allons ajouter dans le bytecode pour la boucle for.
C'est de faire quelque chose de différent. Ce n'est pas à l'aide de la
Iterator
interface à tous. Au lieu de cela, nous faisons appels àget()
, qui n'est défini que par laList
, pas laIterator
.3. Conclusion
Il y a une raison valable pour expliquer pourquoi la liste nous sommes déréférencement est supposé ne pas null - nous sommes en invoquant les méthodes spécifiées par l'interface. Si ces méthodes n'étaient pas mises en œuvre, ce serait différent: jeter un
UnsupportedOperationException
. Si l'objet que nous essayons d'invoquer le contrat n'existait pas, qui n'a tout simplement pas de bon sens.OriginalL'auteur Makoto
Boucle null sera la cause d'une
NullPointerException
, donc vous devez toujours vérifier si la liste est nul, vous pouvez utiliser cette méthode générique:alors avant de faire la boucle toute la liste de vérification de la liste:
OriginalL'auteur Mohamed Aymen Charrada
La raison pour laquelle il n'a pas d'insérer une valeur null check est parce qu'il n'est pas défini. Vous pouvez trouver les règles pour les boucles foreach dans la section 14.14.2 de la Java Langage de Spécification.
Quant à savoir pourquoi il est conçu de cette façon, la plus grande question est pourquoi pas?
C'est naturel. la boucle foreach se comporte comme un équivalent de la boucle sans magie comportement
Il est souhaitée. Habituellement, les gens ne veulent pas de code échouer en silence lorsqu'une erreur se produit.
Le problème de performance proposé par Alvin Wong a probablement été une considération mineure, au mieux. La JVM généralement optimiser loin null vérifie dans les cas où la variable est toujours une valeur non null, alors l'impact sur les performances est négligeable.
OriginalL'auteur Antimony
Si j'ai un ArrayList null, alors le nombre d'objets que contient-il? Ma réponse est zéro. Donc, dans mon esprit, le renforcement de la boucle for ne devraient pas jeter un NPE pour
mais il ne. Évidemment, cela ne va pas changer maintenant dans le java spec donc peut-être qu'ils devraient introduire la elvis et la sécurité de la navigation opérateurs donc c'est pris en charge:
Alors les développeurs ont le choix quant à savoir si ils veulent des NPE à être jetés ou être capable de gérer la valeur null collections gracieusement.
null
ArrayList
..." est un non-sens. Vous ne pouvez pas avoir unnull
quoi que ce soit.null
signifie que vous ne pas en avez un. Il n'est pas judicieux de se demander combien d'objets "il" contient si il n'y a pas de "il". Otoh, que, si vous avez un videArrayList
, que contient zéro des objets.Le projet de la syntaxe de sens; il serait souvent utile de ne pas avoir à vérifier l'existence d'un champ avant de parcourir; en particulier pour les bibliothèques tierces où vous n'avez aucun contrôle sur l'instanciation de la liste. e.g boucle à travers les destinataires dans un javax.mail.MimeMessage
OriginalL'auteur Shane Rowatt
"Je pense que for (Object o : arr){ } est équivalent à
for (int i = 0; i < arr.longueur; i++) { }"
Pourquoi pensez-vous que? comment peut-arr.la longueur de pas de lever une exception si l'arr est nulle?
null ne peut pas avoir une longueur.
Si
for(Object o :arr)
ne jette pas une exception qui doit signifier que l'(:) la boucle est assez intelligent pour vérifier si l'arr est nulle et de ne pas essayer de tirer des éléments hors de lui. Évidemment, le for(;;) de la boucle n'est pas aussi intelligent.si il ne jette pas une exception, il doit être! 🙂
OriginalL'auteur Genia S.
Il n'est souvent pas une bonne idée pour éviter de pointeur null exceptions avec
if(o != null)
gardes - il peut n'avoir aucun sens pouro
nulle, dans le cas où vous voulez lancer et journal d'une exception, si cela s'avère être le cas.OriginalL'auteur Zim-Zam O'Pootertoot
Vous avez déjà répondu à votre question, si l'arr est null arr.longueur jette NullPointerException. Donc
for (Object o : arr){ }
est un équivalent àOriginalL'auteur Ahmet Karakaya