2010-01-14 4 views
2

je le fragment de code Java suivantJAVA: si sans accolades, et la relation de continuer

while (condition1){ 
    switch (someinteger){ 
     case 1: 
      if(condition2) continue; 
      // other stuff here 
      break; 
     // other cases here 
    } 
} 

Tout est bien. Lorsque je génère un fichier de classe, puis que je le décompile à l'aide d'un outil gratuit (JD-gui), je récupère le code suivant.

while (condition1){ 
    switch (someinteger){ 
     case 1: 
      if(!condition2); 
      // other stuff here 
      break; 
     // other cases here 
    } 
} 

Il change if(condition2) continue;-if(!condition2); Je ne pouvais trouver aucune information sur l'autre instruction if (sans accolades). Quelqu'un peut-il expliquer la logique ici? Merci d'avance.

EDIT: J'ai fait d'autres tests et le décompilateur ne fonctionne pas correctement.

est ici le code avant:

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{ 
    int commentON=0, quoteON=0; 
    int b1; 
    while ((b1 = f1.read()) != -1){ 
     switch ((char) b1){ 
      case '\\': 
        if (commentON==0){ 
          quoteON = 1; 
          break; 
        } 
        continue; 
      case '\n': 
        if (commentON>0){ commentON=0; continue; } 
        break; 
      case '%': 
        if (commentON>0) continue; 
        if (quoteON>0) { quoteON=0; break; } 
        commentON=2; 
        continue; 
      default: 
        if (commentON>0) continue; 
        if (quoteON>0) quoteON=0; 
        break; 
     } 
     f2.write(b1); 
    } 
} 

est ici le code décompilé

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException 
{ 
int commentON = 0; int quoteON = 0; 

while ((b1 = f1.read()) != -1) 
{ 
    int b1; 
    switch ((char)b1) 
    { 
    case '\\': 
    if (commentON == 0); 
    quoteON = 1; 
    break; 
    case '\n': 
    if (commentON <= 0) break label109; commentON = 0; break; 
    case '%': 
    if (commentON <= 0); 
    if (quoteON > 0) { quoteON = 0; break label109: } 
    commentON = 2; 
    break; 
    } 
    if (commentON <= 0); 
    if (quoteON > 0) quoteON = 0; 

    label109: f2.write(b1); 
} 
} 

désolé pour embêter tout le monde. : P Je vais essayer de supprimer cette question si je peux.

+0

BTW ... je ne discute pas de l'exactitude du code décompilé. Je suis juste surpris que 'si (condition2) continue;' est la même chose que 'if (! Condition2);' Cela signifie-t-il que l'exécution continue automatiquement du bon point (dans ce cas, le début de la boucle while))? – Jus12

+0

Est-ce juste moi ou ne sont-ils pas logiquement les mêmes? Dans le premier ensemble de code si 'condition1 = true' et' someInteger = 1' et 'condition2 = true' alors ' // autres choses ici' * ne seront pas * exécutées. Mais dans le deuxième bloc de code avec les mêmes conditions '// autres choses ici' * sera * exécuté. – David

+0

@David - Je suis avec vous, je ne le vois pas. – danben

Répondre

4

il est presque impossible pour les décompilateurs de reconstruire votre syntaxe d'origine car ils travaillent à partir de l'interprétation du compilateur de votre code.

vous écrivez du code java, qui est compilé en code octet par le compilateur java. Un décompilateur tente ensuite de créer du code Java à partir du code d'octet.

puisque les deux fragments de code sont logiquement les mêmes, le décompilateur a fait son travail.

EDIT (vu votre commentaire):

En fait, il est tout à fait possible (et cela est assez fréquent) que le décompilateur a fait une erreur. L'instruction if(!condition2); n'a pratiquement aucun effet (à condition que la condition 2 soit en fait un code booléen et non pseudo).

donc votre premier //other stuff here serait traité indépendamment de condition2 dans la version décompilée.

Êtes-vous sûr que le code décompilé fonctionne correctement?

+0

Il est possible que l'OP supposé '' autre chose ici 'apparaîtrait toujours là. Voir le commentaire de @ Anon à la question. – David

+0

je suis d'accord, soit que le décompilateur soit erroné, ce qui dans mon expérience est assez commun bien que je n'ai pas utilisé le décompilateur qu'il a mentionné. – pstanton

1

Une instruction if sans corps ("sans accolades") est simplement une instruction if vide qui n'exécute aucun code.

+0

Wrong - c'est une instruction if qui exécute la ligne de code suivante si la condition est vraie ou l'ignore si elle est fausse ... – Basic

+0

@Basic: Vrai en général, mais vous prenez ma réponse hors contexte; l'OP utilisait l'expression "sans accolades" pour désigner l'instruction 'if (! condition2);'. – mipadi

+0

Mon erreur. Après avoir relu le Q, vous avez raison. – Basic

0

C'est une représentation alternative/canonique de la même logique. Les décompilateurs ne conservent pas le code.

Questions connexes