Question

Je le fragment de code Java suivant

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

Tout va bien. Quand je produis un fichier de classe puis décompiler à l'aide d'un outil gratuit (JD-IUG), je rentrerai 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: Je l'ai fait d'autres tests et le décompilateur ne fonctionne pas correctement.

est le code ici 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);
    }
}

voici 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 prendre la peine tout le monde. : P Je vais essayer de supprimer cette question si je peux.

Était-ce utile?

La solution

il est presque impossible pour décompilateurs reconstituent votre syntaxe d'origine car ils travaillent au large de l'interprétation du compilateur de votre code.

vous écrivez du code Java qui sera compilé à l'octet de code par le compilateur java.

un décompilateur tente alors de créer un code Java à partir du code d'octets.

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.

la déclaration if(!condition2); a essentiellement aucun effet (fourni condition2 est en effet une valeur booléenne et non code pseudo).

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

êtes-vous que le code fonctionne correctement décompilé?

Autres conseils

Une instruction if sans corps ( « sans accolades ») est tout simplement un vide si la déclaration qui exécute pas de code.

Il est une alternative / représentation canonique de la même logique. Décompilateurs ne conservent pas le code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top