#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