IndexOutofBoundException为什么?

时间:2012-03-10 00:26:53

标签: java itext indexoutofboundsexception

我得到了小问题我得到了错误java.lang.IndexOutOfBoundsException:索引:29,大小:29当我启动这一个代码错误在行if ((listaSwiat != null && listaSwiat.get(x) != null) || harm.get(y).getDzienTygodnia(x + 1).equals("Nd"))但不知道为什么索引应该是30而不是29 any1可以帮助?

for (int y = 0; y < harm.size(); y++) {//wiersze
            c1 = new PdfPCell(new Phrase(harm.get(y).nazwa, stdFont));
            c1.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(c1);
            c1 = new PdfPCell(new Phrase("" + harm.get(y).getSumaGodzin() + " / " + harm.get(y).normaGodzin, smallFont));
            c1.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(c1);
            for (int x = 0; x < harm.get(y).dni.size(); x++) {//kolumny
                c1 = new PdfPCell(new Phrase(harm.get(y).dni.get(x).godziny, smallFont));
                //dla swiąt ustal kolor tła na czerwono
                //dla niedziel ustala kolor tla na czerwony
                if ((listaSwiat != null && listaSwiat.get(x) != null) || harm.get(y).getDzienTygodnia(x + 1).equals("Nd")) {
                    c1.setBackgroundColor(BaseColor.RED);
                }

3 个答案:

答案 0 :(得分:3)

在Java(以及许多其他编程语言)中,索引从零开始,而不是一个。

这意味着,如果大小为29,则最后一个有效索引为28,而不是29。

答案 1 :(得分:1)

看起来你正在循环遍历harm.get(y).dni的所有元素并在循环内循环你 做

if ((listaSwiat != null && listaSwiat.get(x) != null) 
|| harm.get(y).getDzienTygodnia(x + 1).equals("Nd"))

最后一次通过循环x = 28并且大小为29.但是你做了

harm.get(y).getDzienTygodnia(x + 1)

所以你得到第29点的元素超出界限,因为像其他答案所说的那样,索引从0开始而不是1.你必须在这里添加一个检查,看看你当前是否在最后一个索引之前检查下一个指数。

答案 2 :(得分:0)

拆分导致异常的行,以便您可以确切地看到get的哪个调用失败。

boolean listaSwiatCheck = listaSwiat != null && listaSwiat.get(x) != null;
if (listaSwiatCheck || harm.get(y).getDzienTygodnia(x + 1).equals("Nd")) {
    c1.setBackgroundColor(BaseColor.RED);
}