为什么会有“ foreach”循环生成异常?

时间:2019-05-31 18:00:48

标签: java

我使用Stack和StringBuilder类编写了用于字符串反转的代码。而且我注意到这段代码中的“ foreach”循环会生成java.util.ConcurrentModificationException,但通常的“ for”循环却不会。那为什么呢?

public static String reverse(String str)
{
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.length(); i++)
        stack.push(str.toCharArray()[i]);
    }


    for (Character c: stack) // generates an exception
    {
        sb.append(stack.pop());
    }

    return sb.toString();
}

我期望字符串反转,但是发生了ConcurrentModificationException。

4 个答案:

答案 0 :(得分:4)

您正在迭代堆栈时更改堆栈(stream_get_contects())。尝试使用其他循环:

stack.pop()

答案 1 :(得分:0)

ConcurrentModificationException当您尝试编辑要迭代的内容时发生。通过调用stack.pop(),您将从当前循环的实体中删除一个实体。

相反,我建议您遍历堆栈直到其为空:

while (!stack.isEmpty()) {
    sb.append(stack.pop());
}

答案 2 :(得分:0)

for-each循环在后台使用迭代器,该迭代器检查“堆栈”中是否存在下一个元素,然后将“字符c”的值设置为该下一个元素。但是您不能在foreach期间更改“堆栈”的大小。通过调用stack.pop(),您违反了该规则。 代替for(Characater c:stack)使用:

while(!stack.empty()){
   sb.append(stack.pop());
}

答案 3 :(得分:0)

function onEdit(e) { var rg = e.range, row = rg.rowStart, col = rg.columnStart, sht = rg.getSheet(); //exit code if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return; //Calculate max value and add 1 rg.offset(0, -1, 1, 1).setValue(//setvalue in colA rg .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA .getValues() .reduce(function(acc, curr) {//get max of colA return Math.max(acc, Number(curr[0])); }, 0) + 1 ); } 返回位于堆栈顶部的元素,然后删除该元素。在使用增强的for循环对其进行迭代时,您无法修改集合,因为如您所见,您将获得pop

一种方法可能是使用ConcurrentModificationException循环并在堆栈上迭代直至耗尽:

while