Java: Se sem colchetes encaracolados, e relação para continuar
-
20-09-2019 - |
Pergunta
Eu tenho o seguinte fragmento de código Java
while (condition1){
switch (someinteger){
case 1:
if(condition2) continue;
// other stuff here
break;
// other cases here
}
}
Está tudo bem. Quando eu gero um arquivo de classe e o descomponho usando uma ferramenta gratuita (JD-Gui), retiro o código a seguir.
while (condition1){
switch (someinteger){
case 1:
if(!condition2);
// other stuff here
break;
// other cases here
}
}
Então isso muda if(condition2) continue;
para if(!condition2);
Não consegui encontrar nenhuma informação sobre o outro se a instrução (sem aparelho). Alguém pode explicar a lógica aqui? Desde já, obrigado.
EDIT: Fiz mais alguns testes e o decompilador não funciona corretamente.
Aqui está o código antes:
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);
}
}
Aqui está o código descompilado
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);
}
}
Desculpe incomodar todos. : P Vou tentar excluir esta pergunta, se puder.
Solução
É quase impossível para os decompiladores reconstruir sua sintaxe original, pois eles estão trabalhando na interpretação do seu código pelo compilador.
Você escreve código Java, que é compilado ao código de byte pelo compilador Java.
Um decompilador tenta criar código Java a partir do código de byte.
Como os dois fragmentos de código são logicamente os mesmos, o decompilador fez seu trabalho.
Editar (vi seu comentário):
Na verdade, é bem possível (e isso é bastante comum) que o decompilador cometeu um erro.
a declaração if(!condition2);
Essencialmente, não tem nenhum efeito (desde que a condição2 seja realmente um código booleano e não pseudo).
Portanto, seu primeiro //other stuff here
seria processado independentemente de condition2
na versão descompilada.
Tem certeza de que o código descompilado funciona corretamente?
Outras dicas
Uma instrução IF sem órgão ("sem aparelho encaracolado") é simplesmente uma instrução IF vazia que não executa o código.
É uma representação alternativa/canônica da mesma lógica. Os decompiladores não preservam o código.