2013-06-17 2 views
0

Мне было интересно, что произойдет, если переменная равна нулю, а в булевом состоянии вызывается метод для этой нулевой переменной. выкинет ли это исключение?Java: оценка короткого замыкания в булевых выражениях

MyObj chair = null 
chair = getSpecialMethod(); 
if(chair != null && chair.size()){ 
    .... 
} 

Что происходит на случай, если chair имеет нулевое значение, будет сгенерировано исключение, несмотря на то, что проверяется на нулевое значение перед темchair.size() называется?

+1

Вы пробовали для себя и посмотрели, что произойдет? –

+1

Этот вопрос не назван соответствующим образом; лучше было бы «Java: оценка короткого замыкания в булевых выражениях» – scottb

+0

Действительно ли более эффективно задавать этот вопрос в Интернете и ждать, возможно, навсегда для возможного неправильного ответа или нескольких взаимно непримиримых ответов, чем попробовать для себя? или найти соответствующую спецификацию языка? – EJP

ответ

6

Нет, вторая часть условия не оцениваются как первый является false, когда chair является null, поэтому NullPointerException не брошен.

Из раздела 15.23. Conditional-And Operator && в спецификации языка Java:

Условный-и оператор & & подобен & (§15.22.2), но вычисляет правый операнд только, если значение его левой Оперативный операнд истинен.

+1

+1 для цитирования спецификации языка Java! Я уже несколько лет кодирую Java, а иногда получаю такие фундаментальные вещи, как эта – bouncingHippo

1

В этом случае это не имеет значения, && является оператором короткого замыкания, и, следовательно, если chair имеет значение null, чем chair.size() не будет работать. Если вы сделали вызов метода на нулевую ссылке, однако было бы бросить NullPointerException

+0

так что исключение не будет выбрано правильно? – bouncingHippo

+0

Не в этом случае, но если вы назовете метод по нулевой ссылке, он будет кидать – aaronman

+0

@bouncingHippo. Как вы думаете? –

1

С тех пор как вы использовали &&, вы в порядке. Он не действует, если он сталкивается с ложным состоянием. Если вы использовали &, то оба условия были бы проверены, и вы получите NullPointerException.