2014-04-06 44 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())为false。

+1

几乎可以肯定。 –

+0

你说得对。我已经插入了更多的打印以查看AND的第一个和第二个运算符的值,并且我得到了您的结果。谢谢 – SegFault

相关问题