Компилятор Java: перестаньте жаловаться на мертвый код - PullRequest
8 голосов
/ 08 марта 2011

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

public static void main(String[] args)
{
    char a = '%';
    System.out.println((int)a);
    // To know where '%' is located in the ASCII table.

    // But, of course, I don't want to start the whole project, so:
    return;

    // The real project starts here...
}

Но компилятор жалуется на return утверждение из-за следующего «мертвого кода».(В то время как в C ++ компилятор подчиняется программисту и просто компилирует оператор return)

Чтобы предотвратить жалобы компилятора, я пишу глупое выражение if:

if (0 != 1) return;

Я ненавижу,Почему компилятор не может делать то, что я спрашиваю?Есть ли какие-нибудь флаги компиляции или аннотации или что-то еще, чтобы решить мою проблему?

Спасибо

Ответы [ 2 ]

10 голосов
/ 08 марта 2011

Нет флагов для поворота этого поведения.Правила, которые делают мертвый код ошибкой времени компиляции, являются частью JLS (§14.21 Недоступные утверждения) и не могут быть отключены.

В цикле есть явная лазейка, которая позволяеткод, подобный следующему:

if (true) return;

someOtherCode(); // this code will never execute, but the compiler will still allow it

Это делается явно , чтобы разрешить «комментирование» или условную компиляцию (в зависимости от некоторого флага static final boolean).

InЕсли вам интересно: лазейка основана на том факте, что значение известной константы выражения условия оператора if не учитывается при проверке достижимости кода внутри или после ifзаявление.Аналогичная ситуация возникает с while, где значения известных констант рассматриваются, поэтому этот код не будет компилироваться:

while (true) return;

someOtherCode(); // this will be flagged as an unreachable statement
1 голос
/ 08 марта 2011

У вас не должно быть много мертвой трески в вашем проекте, однако есть два способа обойти это для прототипирования.

Используйте / * * / для комментирования кода.

    // But, of course, I don't want to start the whole project, so:
    /*
    // The real project starts here...


    */
}

или создайте второй метод.

    // But, of course, I don't want to start the whole project, so:
    // realProject();
}

public static void realProject()
    // The real project starts here...
}
...