2014-04-06 2 views
1

У меня есть эта строка кода:Странный java.lang.ArrayIndexOutOfBoundsException: -1

if (gram.getVN().get(i) != gram.getAxiom() && 
lr1.getAutoma()[j][lr1.getColumn().indexOf(gram.getVN().get(i))].size() != 0) { 
//some actions 

} 

и она отлично работает. Но если я это сделаю:

System.out.println(lr1.getAutoma()[j][lr1.getColumn().indexOf(gram.getVN().get(i))].size()); 

     if (gram.getVN().get(i) != gram.getAxiom() && 
    lr1.getAutoma()[j][lr1.getColumn().indexOf(gram.getVN().get(i))].size() != 0) { 
    //some actions 

} 

Тогда я получаю это исключение, и я не могу понять почему! Может кто-нибудь мне помочь? Спасибо ..

+1

Ну * где * Вы получаете исключение? И можете ли вы упростить пример? (Есть огромное количество вещей, о которых мы ничего не знаем в этом коде.) Обратите внимание, что в первом случае, если первое выражение ('gram.getVN(). Get (i)! = Gram.getAxiom()') оценивает 'false', то он * не будет * оценивать второе выражение, тогда как во втором случае вы выписываете это второе выражение независимо. –

+0

Какова ценность 'j'? Как насчет 'lr1.getColumn(). IndexOf (gram.getVN(). Get (i))'? Сообщение об ошибке в значительной степени объясняет проблему: вы используете индекс массива, -1, который находится за пределами (так как все индексы массива должны быть> = 0). Кстати, вы можете захотеть рассмотреть временную переменную здесь и там - вложение может затруднить чтение. – yshavit

ответ

4

Просто потому, что lr1.getColumn().indexOf(gram.getVN().get(i)) возвращает -1.

В первом фрагменте эта часть даже не выполнена, потому что && является оператором короткого замыкания, а первое условие (gram.getVN().get(i) != gram.getAxiom()) неверно.

+1

Почти наверняка. –

+0

Вы правы. Я добавил больше отпечатков, чтобы увидеть значения первого и второго операторов AND, и я получаю результат. благодаря – SegFault

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