L'essentiel for
La structure du relevé est la suivante :
BasicForStatement:
for ( \[ForInit\] ; \[Expression\] ; \[ForUpdate\] ) Statement
Maintenant, de JLS §14.14.1.3. Achèvement abrupt de for
Déclaration :
Si l'exécution de la Déclaration se termine brusquement à cause d'un continue
sans étiquette puis les deux étapes suivantes sont exécutées en séquence :
-
D'abord, si le ForUpdate est présente, les expressions sont évaluées en séquence de gauche à droite ; leurs valeurs, le cas échéant, sont rejetées. Si le ForUpdate n'est pas présente, aucune action n'est entreprise.
-
Deuxièmement, un autre for
étape d'itération est effectuée.
Si l'exécution de la Déclaration se termine brusquement à cause d'un continue
avec étiquette L
alors il y a un choix à faire :
-
Si le for
La déclaration a l'étiquette L
puis les deux étapes suivantes sont exécutées en séquence :
-
Premièrement, si le ForUpdate est présente, les expressions sont évaluées en séquence de gauche à droite ; leurs valeurs, le cas échéant, sont rejetées. Si la partie ForUpdate n'est pas présent, aucune action n'est entreprise.
-
Deuxièmement, un autre for
étape d'itération est effectuée.
-
Si le for
La déclaration n'a pas d'étiquette L
le for
se termine brusquement à cause d'un "continue with label". L
.
(c'est moi qui souligne)
ForUpdate dans votre cas, c'est i++
. Sur la base de ce qui précède :
-
Votre premier extrait relève du premier cas, donc i
est incrémenté.
-
Votre deuxième extrait relève du deuxième cas, donc i
n'est pas incrémenté parce que le for
La déclaration se termine brusquement.
Notez que si vous aviez continue LABEL1
dans votre deuxième extrait, i
aurait été incrémenté comme dans votre premier extrait (conformément à la JLS).
Comme conseil pour l'avenir, pour définitif les réponses concernant les règles de langue/sémantique, vous devez toujours consultez la spécification de la langue. Pour Java, il s'agit du JLS .