2015-09-23 2 views
2

Выполняет ли java второе условие в (test1 || test2), если первое верно?Как условия проверки java

Я использую Дополнительно и у меня есть что-то вроде этого:

if (!opt.isPresent() || opt.get() == currentPlayer.getSelectedRegion()) 

и там будет проблемой, если первый тест верно и ява вычислить второе испытание.

+1

И дополнительно к ответам, ссылка в [java-8-specification] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.24). – MalaKa

ответ

3

Если первое условие истинно, второе условие не оценивается.

Если первое условие ложно, выполняется также второе условие.

Вот почему вы можете написать код вроде следующего без NullPointerException

if (str == null || str.length() == 0) { 
    // do something 
} 

Оператор | (вместо ||) будет оцениваться как условия

Так код

if (str == null | str.length() == 0) { 
    // do something 
} 

может генерировать NullPointerException, если str is null

2

Выполняет ли java второе условие в (test1 || test2), если первое верно?

No. Логическое или будет короткого замыкания, первый true достаточно, чтобы сделать выражение true. После этого дальнейшие условия не будут оцениваться.

1

Нет, java short-cut операторы, второй аргумент не оценивается, если первый. Руда более формальными:

  • для x || y, y только вычисляется, если x является false; и
  • для x && y, x оценивается только в том случае, если y является true.

Это позволит увеличить производительность и может быть полезным и сложно:

  • ПОЛЕЗНЫЕ: чтобы помешать вам делать такие вещи, что ошибка генерируется. Наиболее типичным примером является null проверка:

    if(x != null && x.someTest()) 
    

    это предотвратит .someTest вызывается, если x является null.

  • сложно: проблематичный аспект может быть, если вы вызываете метод, который не только возвращает что-то, но и изменяет состояние.Например:

    public class Foo { 
        private int checked = 0; 
    
        bool someCondition() { 
         return (checked % 2) == 0; 
        } 
    
        bool neverChecked() { 
         checked++; 
         return checked == 1; 
        } 
    } 
    

    если вы сейчас звоните:

    if(foo.someCondition() || foo.neverChecked()); 
    

    это одна из главных причин, это целебным держать «добытчик» (думает, что вычислить вещи объекта), и «сеттер "(вещи, которые изменяют состояние объекта), четко разделены. С того момента, как вы начинаете смешивать, в некоторых случаях можно получить сложное поведение.

это может быть намерение, что вы всегда увеличиваем checked, но это будет только тогда, когда .someCondition случается false.

1

Если вы используете || и &&, а не | и &, Java не будет беспокоить, чтобы оценить правый операнд.

Смежные вопросы