Вопрос-ответ

Semicolon at end of 'if' statement

Точка с запятой в конце инструкции 'if'

Сегодня, после получаса поиска ошибки, я обнаружил, что можно поставить точку с запятой после инструкции if вместо кода, вот так:

if(a == b);
// Do stuff

Что в основном означает, что материал будет выполнен независимо от того, a равно b или нет, и if оператор не имеет никакого смысла вообще. Почему Java не выдает мне ошибку? Есть ли какая-либо ситуация, в которой это было бы полезно?

Переведено автоматически
Ответ 1

Почему это происходит?

Спецификация языка Java гласит, что:


Пустой оператор


Пустой оператор ничего не делает.


EmptyStatement:
;

Выполнение пустой инструкции всегда завершается нормально


По сути, это означает, что вы хотите выполнить пустую инструкцию if a == b

if(a == b);

Что вам следует делать:

Есть два основных решения этой проблемы:


  1. Вы можете избежать проблем с пустой инструкцией, используя средство форматирования кода и сопутствующие материалы внутри if with { и }. Делая это, ваша пустая инструкция будет намного более читаемой.


    if(a == b){
    ;
    }


  2. Вы также можете проверить инструменты, используемые для статического анализа кода, такие как:




    Они могут мгновенно выявить проблемы, подобные этой.



Я бы рекомендовал объединить оба решения.

Ответ 2

Есть ли какая-либо ситуация, в которой это было бы полезно?


Полезно? Как в "делает ваш код чище, понятнее, быстрее, более ремонтопригодным"? Совсем нет. Скорее всего, это плохой, запутанный код.

Но это не обязательно безвредно. Такая инструкция может выполнять действия и / или изменять состояние из-за методов, которые вызывают побочные эффекты, и необязательно оценивать эти методы из-за короткого замыкания операторов.

if( a() && b() );

Здесь a() или b() может что-то сделать и b() будет выполняться, только если a() значение true.

Что касается почему, я думаю, ответ прост: было бы хуже отклоняться от определенного, ожидаемого поведения (например, таких операторов, как while(reader.read());), чем альтернатива написания разработчиками плохого кода.

Написание плохого кода возможно всегда. И просто повторю, это был бы плохой код почти в любом случае.

Ответ 3

Возможный вариант использования:

if (a==b);
else {
// Do something
}

Не очень хорошо, но возможно.

Тем не менее, я действительно думаю, что спецификация Java должна запрещать пустое значение if.

Ответ 4

Если вы используете Eclipse, вы можете заставить его предупреждать вас об этих инструкциях:

Java-> Компилятор-> Ошибки/ Предупреждения

java