JAVA:如果没有大括号,并且关系继续

时间:2010-01-14 00:41:44

标签: java syntax decompiler

我有以下java代码片段

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

一切都很好。当我生成一个类文件然后使用免费工具(JD-gui)对其进行反编译时,我得到了以下代码。

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

因此它将if(condition2) continue;更改为if(!condition2); 我找不到另一个if语句(没有大括号)的任何信息。 谁能解释这里的逻辑?提前致谢。

编辑:我做了一些测试,反编译器无法正常工作。

这是以前的代码:

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);
    }
}

这是反编译代码

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);
}
}
抱歉打扰每个人。 :P 如果可以,我会尝试删除这个问题。

3 个答案:

答案 0 :(得分:4)

反编译器几乎不可能重建原始语法,因为它们正在处理编译器对代码的解释。

你编写的java代码,由java编译器编译成字节代码。

然后,反编译器尝试从字节代码创建java代码。

由于两个代码片段在逻辑上是相同的,因此反编译器完成了它的工作。

编辑(看到你的评论):

实际上,反编译器发生错误很可能(这很常见)。

语句if(!condition2);基本上没有任何效果(前提条件2确实是布尔值而不是伪代码)。

因此,无论反编译版本中的//other stuff here如何,都会处理您的第一个condition2

你确定反编译的代码能正常工作吗?

答案 1 :(得分:1)

没有正文的if语句(“没有花括号”)只是一个不执行代码的空if语句。

答案 2 :(得分:0)

它是同一逻辑的替代/规范表示。反编译器不保留代码。