JAVA: если без фигурных скобок, и отношение к продолжению - PullRequest
2 голосов
/ 14 января 2010

У меня есть следующий фрагмент кода 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);
}
}

Простите, что беспокою всех. :П Я постараюсь удалить этот вопрос, если смогу.

Ответы [ 3 ]

4 голосов
/ 14 января 2010

декомпиляторам почти невозможно восстановить исходный синтаксис, поскольку они работают на интерпретации вашего кода компилятором.

вы пишете код Java, который компилируется в байт-код компилятором Java.

декомпилятор затем пытается создать Java-код из байтового кода.

, поскольку два фрагмента кода логически совпадают, декомпилятор выполнил свою работу.

РЕДАКТИРОВАТЬ (увидел ваш комментарий):

На самом деле, вполне возможно (и это довольно часто), что декомпилятор допустил ошибку.

утверждение if(!condition2); по сути не имеет никакого эффекта (при условии, что условие2 действительно является логическим, а не псевдокодом).

поэтому ваш первый //other stuff here будет обработан независимо от condition2 в декомпилированной версии.

Вы уверены, что декомпилированный код работает правильно?

1 голос
/ 14 января 2010

Оператор if без тела («без фигурных скобок») является просто пустым оператором if, который не выполняет код.

0 голосов
/ 14 января 2010

Это альтернативное / каноническое представление той же логики. Декомпиляторы не сохраняют код.

...