web-dev-qa-db-fra.com

Erreur de compilation de l'instruction inaccessible en Java

class For1
{
  public static void main(String args[])
  {
    int a = 0;
    for(;;)
    {
      break;
      System.out.println(a); //Line 1
      ++a;//Line 2
    }
  }
}

Je sais que la ligne 1/la ligne 2 ne sera jamais exécutée . Mais je ne comprends toujours pas pourquoi une erreur de compilation est générée . Je reçois une erreur de compilation "instruction inaccessible".

Cela signifie-t-il que le compilateur vérifie s'il est capable de compiler toutes les branches/lignes de code?

8
UnderDog

Cela signifie-t-il que le compilateur vérifie s'il est capable de compiler toutes les branches/lignes de code?

Cela signifie que le compilateur vérifie que chaque instruction est accessible.

De section 14.21 du JLS :

C'est une erreur de compilation si une instruction ne peut pas être exécutée car elle est inaccessible.

Cette section est consacrée à une explication précise de la Parole "accessible". L'idée est qu'il doit y avoir un chemin d'exécution possible à partir du début du constructeur, de la méthode, de l'initialiseur d'instance ou de l'initialiseur statique qui contient l'instruction à l'instruction elle-même. L'analyse prend en compte la structure des déclarations.

La section documente ensuite la définition de l'accessibilité.

En particulier, les points pertinents dans votre cas sont les suivants:

Toute autre instruction S dans un bloc non vide qui n'est pas un bloc de commutation est accessible si et seulement si l'instruction précédente est complétée normalement.

Une instruction break, continue, return ou throw ne peut pas se terminer normalement.

Ainsi, votre déclaration "ligne 1" est précédée d'une déclaration (break;) que ne peut pas compléter normalement et est donc inaccessible.

12
Jon Skeet

Le compilateur est également capable de tirer cette conclusion et suppose que vous commettez une erreur. Et oui, le compilateur Java effectue une assez bonne "analyse de flux de données". Le message associé le plus courant est celui concernant les variables non initialisées. La deuxième plus fréquente concerne, je crois précisément, celle relative au code inaccessible.

6
Mario Rossi

Cela signifie-t-il que le compilateur vérifie s'il est capable de compiler pour toutes les branches/lignes de code?

Oui, le compilateur compile le corps entier du code et crée un code octet en fonction de votre code. Il est suffisamment intelligent pour détecter unreachable code et dead code. Immédiatement break dans le for-loop rend d'autres instructions inaccessibles. 

for(;;){
   break;
   ... // unreachable statement
}


int i=1;
if(i==1)
  ...
else
  ... // dead code
3

Le code inaccessible n'a pas de sens et est redondant. Si vous avez du code inaccessible dans votre programme, c'est une erreur et il faut le corriger. Par conséquent, le compilateur génère une erreur.

Vous pouvez vous référer à des questions similaires ci-dessous

Code inaccessible: erreur ou avertissement? and Pourquoi Java a-t-il une erreur du compilateur "instruction inaccessible"?

2
Aniket Thakur

Le compilateur est en mesure de déterminer que ces deux instructions ne seront jamais, jamais exécutées, et vous aide à écrire du code correct en refusant de le compiler, car cela a 99,9% de chance d’être une erreur plutôt que le choix délibéré d’ajouter des instructions qui ne le seront jamais. être exécuté.

1
JB Nizet

Le compilateur vérifiera s'il y a plus de code après certains mots-clés. Un autre mot clé susceptible de générer un message similaire est le remplacement de break par return.

0
npinti