2014-04-06 45 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

相關問題