簡體   English   中英

使用嵌套 while 循環添加到 ArrayList 時出現 IndexOutOfBoundsException

[英]IndexOutOfBoundsException when adding to ArrayList using nested while loops

我正在嘗試創建一個程序,該程序讀取一個文件,該文件包含一個州每個學區的人數,並輸出總人數、兒童總數和貧困線以下兒童的總數。 有 56 個狀態,但我只能得到 55 個的輸出。

我也嘗試將int i = 0放在第一個 while 循環中,但我得到了一堆 0。

int i = 0; int j = 1;
        while (j <= Integer.parseInt( popInfo.get(popInfo.size() - 1).getStateCode() )) {
            int tPopCt = 0, cPopCt = 0, cPovPopCt = 0;

            while (popInfo.get(i).getStateCode().equals(String.format("%02d", j))) {
                tPopCt += Integer.parseInt(popInfo.get(i).getTotalPopulation());
                cPopCt += Integer.parseInt(popInfo.get(i).getChildPopulation());
                cPovPopCt += Integer.parseInt(popInfo.get(i).getChildPovertyPopulation());
                i++;
            }
            output.add(new Output(String.format("%02d", j), tPopCt, cPopCt, cPovPopCt));
            j++;
        }

我希望輸出的最后一行以 56(最后一個 StateCode)開頭,但是出現錯誤。 當我將第一個 while 循環設置為j < ...而不是j <= ... ,我得到55 5956920 963445 157356 ,這是正確的,但不包括 56。

請幫忙。

編輯

錯誤消息和堆棧跟蹤...

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 13486 out of bounds for length 13486
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:458)
at Poverty.<init>(Poverty.java:35)
at Poverty.main(Poverty.java:70)

您應該考慮重新設計您的程序。 你沒有寫popInfo集合中元素的類型,所以我們稱之為PopData 也許您應該使用一個 for-each 循環而不是嵌套的 while 循環。 在你的程序的這種情況下,結構可能看起來像(從提取值data代表您的集合中的數據的一個記錄變量):

int globalTPopCt = 0;
int globalCPopCt = 0;
int globalCPovPopCt = 0;
for(PopData data : popInfo) {
    int state = Integer.parseInt(data.getStateCode());
    //local counters
    int localTPopCt = Integer.parseInt(data.getTotalPopulation());
    int localCPopCt = Integer.parseInt(data.getChildPopulation());
    int localCPovPopCt = Integer.parseInt(data.getChildPovertyPopulation());
    //global (cumulated) counters
    globalTPopCt += localTPopCt;
    globalCPopCt += localCPopCt;
    globalCPovPopCt += localCPovPopCt;

    output.add(new Output( ... ));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM