Компилятор Java: перестаньте жаловаться на мертвый код

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

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;

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

Спасибо


person Martijn Courteaux    schedule 08.03.2011    source источник
comment
Я рекомендую делать ваши тесты во внешнем классе, тесты Junit могут быть решением.   -  person reef    schedule 08.03.2011
comment
@reef Я думаю, что он имеет в виду «эксперимент», а не модульное тестирование   -  person Rup    schedule 08.03.2011
comment
Java имеет другую философию дизайна, чем C. C позволяет вам все, что явно не запрещено, и не пытается помешать вам делать ошибки (предполагается, что это ваша проблема). Java пытается помешать вам делать вещи, которые не имеют смысла, и будет кричать, если узнает, что какой-то код не будет выполняться. Нравится вам это или нет, но это так.   -  person Joachim Sauer    schedule 08.03.2011
comment
@Rup: я бы дал тот же совет для экспериментов. У меня, например, есть проект с именемcrat по крайней мере с одним классом ScratchMain с пустым методом main во всех моих рабочих пространствах ;-)   -  person Joachim Sauer    schedule 08.03.2011
comment
@Rup: да, я понял, это была своего рода рекомендация для конкретных экспериментов, подобных тому, что было показано в его вопросе.   -  person reef    schedule 08.03.2011


Ответы (2)


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

В цикле есть явная лазейка, которая позволяет использовать такой код:

if (true) return;

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

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

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

while (true) return;

someOtherCode(); // this will be flagged as an unreachable statement
person Joachim Sauer    schedule 08.03.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...
}
person Peter Lawrey    schedule 08.03.2011
comment
Я бы не советовал использовать /* */ для комментирования мертвого кода: это приводит к тому, что код невидим для IDE: он не обнаруживается при поиске ссылок, на него не влияет рефакторинг, вы не получите подсветку синтаксиса и так далее. на. Я обнаружил, что упаковка мертвого кода с помощью if (false) { } является более чистым решением. Лучшее решение в долгосрочной перспективе — это, конечно, удалить весь мертвый код и оставить историю жить только в системе контроля версий ;-) - person Joachim Sauer; 08.03.2011
comment
Intellij неплохо справляется с рефакторингом прокомментированного кода (он также жалуется, что у вас есть код в ваших комментариях;), однако его удаление обычно является лучшей политикой. - person Peter Lawrey; 08.03.2011
comment
ИДЕЯ делает это? Это аккуратно, но звучит несколько хрупко. Он также жалуется на образцы кода в JavaDoc? - person Joachim Sauer; 08.03.2011
comment
Это дает вам возможность обновлять комментарии и строки, например, при переименовании переменной/метода. Комментарии, потому что вы можете ссылаться на метод/переменную и строки, потому что вы можете изменить вывод сообщения, чтобы он соответствовал переменной, или вы можете использовать отражения. Не уверен насчет Javadoc, так как я не часто их использую, особенно. с кодом в нем. - person Peter Lawrey; 08.03.2011