14 votes

While(false) provoque une erreur de compilation d'une instruction inaccessible

J'ai récemment supprimé un bloc de code de notre base de code avant une publication et j'ai utilisé une instruction if(false) pour empêcher l'exécution :

if (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

Cela compile bien et empêchera l'exécution du bloc de code incriminé (à tort ou à raison, ce n'est pas l'argument actuel).

Cependant, un peu par hasard, j'ai changé le bloc ci-dessus en :

while (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

et a reçu une erreur de compilation de déclaration inaccessible.

Je comprends l'erreur de compilation et j'en comprends les raisons, mais j'ai du mal à comprendre la différence entre les deux blocs et pourquoi le premier se compile bien mais pas le second alors qu'ils ont tous les deux des instructions inaccessibles.

13voto

Stefano Sanfilippo Points 11123

Dans les deux cas, le compilateur devrait soulever une erreur, car le code entre accolades est essentiellement inutile, mais if (false) a été conservé en Java pour simuler le préprocesseur C/C++. #if 0 La désactivation d'une partie du code à des fins de test ou de débogage est une méthode assez courante.

EDIT : pour référence, "Compilation conditionnelle est détaillée à la fin de l'article chapitre 14.21 de la spécification du langage Java.

2voto

Jim Points 149

"Java utilise un simple algorithme d'analyse de flux pour trouver les cas les plus courants de code inaccessible, et tous ces blocs de code inaccessibles seront signalés comme des erreurs au moment de la compilation. C'est pourquoi votre déclaration "while (false) { ... }" produit une erreur.

Cependant, Java fait une exception spéciale pour "if (false) { ... }", car les programmeurs utilisent souvent cette construction au cours du développement pour désactiver temporairement une partie du programme. C'est pourquoi le compilateur accepte cette déclaration.

Si vous êtes intéressé par les détails, reportez-vous à la description des déclarations inaccessibles dans la spécification du langage Java (Java Language Specification) @ http://docs.oracle.com/javase/specs/#14.21 ."

Cité dans http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X