Java: если без вьющихся скобков и отношения к продолжению

StackOverflow https://stackoverflow.com/questions/2061440

  •  20-09-2019
  •  | 
  •  

Вопрос

У меня есть следующий фрагмент кода 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);Я не мог найти никакой информации о другом, если оператор (без скобков). Кто -нибудь может объяснить здесь логику? Заранее спасибо.

РЕДАКТИРОВАТЬ: Я сделал еще несколько тестов, и декомпилятор работает неправильно.

Вот код раньше:

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 Я попробую удалить этот вопрос, если смогу.

Это было полезно?

Решение

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

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

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

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

Изменить (видел ваш комментарий):

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

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

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

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

Другие советы

Оператор IF без тела («без вьющихся скобок») является просто пустым оператором, если не выполняет код.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top