为了账号安全,请及时绑定邮箱和手机立即绑定

为什么'foreach'循环会产生异常?

为什么'foreach'循环会产生异常?

拉丁的传说 2022-12-28 10:12:08
我使用 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 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您正在更改堆栈 ( stack.pop()),同时遍历它。尝试使用不同的循环:


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]);

    }



    while(!stack.isEmpty()){

         sb.append(stack.pop());

    }


    return sb.toString();

}


查看完整回答
反对 回复 2022-12-28
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

pop返回堆栈顶部的元素,然后删除该元素。您不能在使用增强的 for 循环迭代集合时修改集合,因为如您所见,您将得到一个ConcurrentModificationException.


一种方法是使用while循环并遍历堆栈直到耗尽:


while (!stack.empty()) {

    sb.append(stack.pop());

}


查看完整回答
反对 回复 2022-12-28
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


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


while (!stack.isEmpty()) {

    sb.append(stack.pop());

}


查看完整回答
反对 回复 2022-12-28
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

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


while(!stack.empty()){

   sb.append(stack.pop());

}


查看完整回答
反对 回复 2022-12-28
  • 4 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信