public void test(){
ArrayList<String> myList = new ArrayList<String>();
myList.add("String 1");
myList.add("String 2");
myList.add("String 3");
myList.add("String 4");
myList.add("String 5");
for(String s : myList){
if (s.equals("String 2")){
myList.remove(s);
}
}
}
public void test(){
ArrayList<String> myList = new ArrayList<String>();
myList.add("String 1");
myList.add("String 2");
myList.add("String 3");
for(String s : myList){
if (s.equals("String 2")){
myList.remove(s);
}
}
}
不同的是,第一个列表包含5项,而第二个列表包含3项。使用的JVM是:
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
问题:为什么第二段代码不抛出java.util.concurrentModificationException?
从arraylist.iterator()
返回的迭代器在实现中,我们显然只在调用next()
时检查结构修改,而不是在调用hasnext()
时检查结构修改。后者看起来如下所示(在Java8下):
public boolean hasNext() {
return cursor != size;
}
所以在第二种情况下,迭代器“知道”它返回了两个元素,而列表只有两个元素...所以hasnext()
只返回false,我们永远不会第三次调用next()
。
我认为这是一个实现细节--基本上检查不是那么严格。在这种情况下,hasnext()
执行检查并抛出异常是完全合理的。
java.lang.AssertionError:预期测试将在org.junit.Assert.Fail(Assert.java:88)在org.junit.rules.ExpectedException.FailduetOmissingException(ExpectedException.java:263)在org.junit.rules.ExpectedException.Access$20
我相信我的问题有一个简单的理论答案,但我找不到。 ...我希望显示的错误消息是 ORA-20001value_error 但是,不幸的是,我得到了:
有一个列表正在被两个线程同时排序和迭代。不出所料,它导致。不清楚的是错误的时间。 输出:(出现几次) 为什么当第一个线程完成时,另一个线程的迭代失败? 当两个线程分别完成排序并获得迭代器时,底层迭代器将不会改变。为什么在此阶段会导致异常?
尝试部署Web应用程序时,我遇到以下错误: 错误-站点XXX的容器XXX\u 0未在预期的时间限制内启动。运行时间=1800.4463925秒 我试图部署一个节点应用程序。使用自动部署。部署文件。部署文件如下所示: package.json文件具有以下脚本: 和服务器。详情如下: 我从研究中得出的结论是: 没有足够的时间让app启动 端口未打开/启动时没有响应ping 为了解决(1)我把WEBSI
我正在对我的一个服务进行Mockito单元测试,我试图模拟它,但无法返回所需的对象。我的代码片段如下所示: 现在,通过了测试用例,但是失败了,因为。 我很困惑,我不是刚刚模拟了返回一个的行为吗?我做了一些研究,发现了这篇文章:Mockito when/then not returning expected value,我想知道如何使用“doreturn()...when()”定义嘲笑行为,但仍然没
这是我到目前为止用于此任务的代码: 但是如果我输入了一个无效的日期,比如,它将转换为,而不是抛出异常。