базовый вопрос о предложении Java if

#java #if-statement

#java #оператор if

Вопрос:

этот вопрос настолько прост, что я даже не знаю, как я мог бы его найти…

прошло пару лет с тех пор, как я программировал, но я программировал около семи лет, и я отчетливо помню (по крайней мере, о C ), что всякий раз, когда предложение if начинается с, например:

 if((x-1) >= 0) amp;amp; ...
  

просто не имеет значения, что следует, если часть, оставшаяся от amp;amp;, является false . итак, как, черт возьми, можно было бы получить исключение из массива для x = 0 при использовании «x-1» в правой части?

я никогда не думал, что мне когда-либо придется задавать такой простой вопрос… я надеюсь, что я не упускаю из виду что-то важное (уже почти 4 часа утра …) и надеюсь, что кто-нибудь здесь может помочь…

Комментарии:

1. Круглые скобки в вашем условии неверны. Не могли бы вы исправить их, чтобы обеспечить лучший контекст?

2. Если вы можете предоставить короткую, но полную программу, демонстрирующую проблему, я уверен, что мы сможем вам помочь.

3. Пустой массив выдаст исключение index out of bounds, если вы попытаетесь получить доступ к элементу 0 .

4. Вы должны быть правы в отношении оценки ярлыка, поэтому я предполагаю, что что-то еще не так, но вы не привели достаточного примера, чтобы сказать наверняка. В любом случае — это дурной тон. За 1/100 времени, которое вы потратили на выяснение этого, вы могли бы создать вложенное if, которое было бы понятнее по замыслу и проще для чтения. Преступно тратить свое время И других людей, шифруя свой код подобным образом. Добро пожаловать в Java.

5. Если сейчас 4 часа утра, вы не в том состоянии, чтобы писать / отлаживать программы. Не говоря уже о том, чтобы выразить свое разочарование по поводу SO. Иди спать.

Ответ №1:

Потому что (x-1) может быть больше 0, когда x == array.length. Следующим условием, вероятно, будет array[x] и array[ array.length ] -> OutOfBounds.

Я предполагаю, что вы делаете что-то похожее:

 if(((x-1) >= 0) amp;amp; array[x] != null)
  

где вы могли бы сделать что-то вроде:

 int index = x-1;
if (index >=0 amp;amp; index < array.length) {
   ...
}
  

Комментарии:

1. прежде всего — я не знаю, что там происходило вчера, я открыл проект сегодня, установил там точку останова, чтобы сделать снимок экрана в режиме отладки, чтобы можно было видеть текущее значение и код вокруг него, но я больше никогда не получал исключение outofbounds. теперь он работает так, как и должен. и просто для справки, вот как на самом деле выглядит мой код — это часть рекурсивного алгоритма заполнения: if(x < 0 || x >= dimension || y < 0 || y >= dimension || board[x][y] == CHANGED) return; board[x][y] = CHANGED; /* cell left of current one */ if(((x-1) >= 0) amp;amp; ...) ...

2. также — спасибо за попытку помочь, я действительно ценю это! ваш комментарий определенно был бы наиболее полезным, если бы то, что вы описали, было бы проблемой 🙂

Ответ №2:

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

это также возможно, если x имеет не тип int, а некоторый неподписанный тип. Единственный неподписанный тип, который приходит мне на ум, — это char . Итак, если x является символом и равен 0, и вы вычитаете 1, в итоге x будет равен 65 535 и, следовательно, меньше 0