Почему нет ошибки времени компиляции?Странно - Ява - PullRequest
3 голосов
/ 23 сентября 2011

У меня был оператор if, проверяющий какое-то значение, и я обнаружил странную ошибку (не уверен!).Мой код был неверно синтаксически и в результате он дал неправильный результат, однако eclipse не вызвала никаких ошибок при компиляции.Почему мой код ниже работает?

if((this.trackPointList.get(point).getTurnOutId().equals(seg.getSegRef().getTurnOut())) && seg.getSegRef().getKind().equals("arc")); // <---- See here I have semicolon
    {
       ... code to run ...
    }

Выше кода проверяет только первое условие и игнорирует seg.getSegRef().getKind().equals("arc"), но я полагаю, что это должно вызвать проблему во время компиляции. Я прав?Моя логика сработала, как только я отладил ее, просматривая строку за строкой и находя эту точку с запятой.Я буду признателен, если кто-то может объяснить, если это правильный синтаксис.

Просветите меня, пожалуйста!

Ответы [ 5 ]

11 голосов
/ 23 сентября 2011

; заставляет Java думать, что тело условного выражения if завершено, даже если перед ним нет другого кода. По сути, код в операторе if выполняется, но тело не существует, потому что там есть ;.

{ ...code to run...} - это просто блок кода, который выполняется, и все, что объявлено внутри этого блока, не видно за пределами блока. Он всегда будет работать здесь, потому что он не является частью блока if.

edit: вот еще один вопрос переполнения стека о блоках { }: Что означают фигурные скобки в Java?

2 голосов
/ 23 сентября 2011

Оператор if, за которым следует точка с запятой, называется «пустым оператором if».Это редко полезно, но синтаксически законно.

Вы можете написать что-то вроде этого

if ( doSomethingThatReturnsABoolean() )
   ;  // Empty statement
else
   doSomeOtherThing()

, но было бы лучше написать

if ( !doSomethingThatReturnsABoolean() )
   doSomeOtherThing()

ОтносительноВаше наблюдение, что проверяется только первое условие: если первое условие возвращает false, второе условие не будет проверено, потому что

(false && secondCondition)

всегда равно false, поэтому значение secondCondition не имеет значения.

2 голосов
/ 23 сентября 2011

Код синтаксически правильный.Вы можете написать if без скобок, например:

if(condition) statement;

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

int a = 0;;
;;;

Так что пустое if также допустимо, хотя в этом нет особого смысла

1 голос
/ 23 сентября 2011

if(condition); эквивалентно if(condition){}

То же самое с for loop & while loop:

for(;condition;); эквивалентно for(;condition;){}

while(condition); эквивалентно while(condition){}

1 голос
/ 23 сентября 2011

; после оператора if(..) представляет собой пустой оператор, который выполняется условно, когда if(..) принимает значение true. { .. } представляет блок кода, который всегда выполняется с собственной областью действия.

Второе условие может игнорироваться, если первое условие ложно из-за оценки короткого замыкания .

...