concurrentmodification exception -- 设置一个数组元素
concurrentmodification exception -- setting an array element
我在 JAVAdocs 中读到,当您在遍历 it.In 时在结构上修改列表时会出现并发修改异常 it.In 我的情况是我没有更改数组的大小,只是替换了数组中的一些索引。尝试了很多东西,但这似乎不起作用。
提供以下代码片段。(代码是解决n皇后问题的递归函数)
public ArrayList<ArrayList<String>> solve(int a, String[] arr,int beg,
ArrayList<ArrayList<String>> result) {
for( int i=beg;i< a*a ;i++){
String s = arr[i];
if(s.equals(".")){
//fill Q and look for valid combs
arr[i] = "Q";
if(i== (a*a)-1){
String[] t = (String[])(arr.clone());
result.add(new ArrayList<String>(Arrays.asList(t)));
}else{
ArrayList<Integer> filled = fillX(arr,i,a,"x");//this function fills "X" in queen's path and returns the filled indices
ArrayList<ArrayList<String>> tmp = solve(a,arr,i+1,result);
if(!tmp.isEmpty()){
for(ArrayList<String> t :tmp){
result.add((ArrayList<String>)t.clone());
}
}
for(int x = 0;x< a*a;x++){
if(filled.contains(x)){
arr[x] = ".";//the exception goes away on removing this line
}
}
}
arr[i] =".";
}
}
return result;
}
堆栈跟踪--
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Solution.solve(Solution.java:29)
at Solution.solveNQueens(Solution.java:7)
at Main.main(Main.java:323)
我相信您遇到了典型的并发修改场景。
ArrayList<ArrayList<String>> tmp = solve(a, arr, i + 1, result);
for (ArrayList<String> t : tmp) { // <-- iterating through the result of a recursive call.
result.add((ArrayList<String>)t.clone());
}
...
return result; // <-- while the recursive call returns the `result` argument.
它基本上是在做类似的事情:
for (ArrayList<String> t : result) {
result.add((ArrayList<String>)t.clone());
}
恕我直言,您可以使 resolve
成为 void
方法,并将结果直接添加到传入的结果参数中;或者您可以删除结果参数并使每个递归调用创建一个本地列表并 return 它。
我在 JAVAdocs 中读到,当您在遍历 it.In 时在结构上修改列表时会出现并发修改异常 it.In 我的情况是我没有更改数组的大小,只是替换了数组中的一些索引。尝试了很多东西,但这似乎不起作用。
提供以下代码片段。(代码是解决n皇后问题的递归函数)
public ArrayList<ArrayList<String>> solve(int a, String[] arr,int beg,
ArrayList<ArrayList<String>> result) {
for( int i=beg;i< a*a ;i++){
String s = arr[i];
if(s.equals(".")){
//fill Q and look for valid combs
arr[i] = "Q";
if(i== (a*a)-1){
String[] t = (String[])(arr.clone());
result.add(new ArrayList<String>(Arrays.asList(t)));
}else{
ArrayList<Integer> filled = fillX(arr,i,a,"x");//this function fills "X" in queen's path and returns the filled indices
ArrayList<ArrayList<String>> tmp = solve(a,arr,i+1,result);
if(!tmp.isEmpty()){
for(ArrayList<String> t :tmp){
result.add((ArrayList<String>)t.clone());
}
}
for(int x = 0;x< a*a;x++){
if(filled.contains(x)){
arr[x] = ".";//the exception goes away on removing this line
}
}
}
arr[i] =".";
}
}
return result;
}
堆栈跟踪--
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Solution.solve(Solution.java:29)
at Solution.solveNQueens(Solution.java:7)
at Main.main(Main.java:323)
我相信您遇到了典型的并发修改场景。
ArrayList<ArrayList<String>> tmp = solve(a, arr, i + 1, result);
for (ArrayList<String> t : tmp) { // <-- iterating through the result of a recursive call.
result.add((ArrayList<String>)t.clone());
}
...
return result; // <-- while the recursive call returns the `result` argument.
它基本上是在做类似的事情:
for (ArrayList<String> t : result) {
result.add((ArrayList<String>)t.clone());
}
恕我直言,您可以使 resolve
成为 void
方法,并将结果直接添加到传入的结果参数中;或者您可以删除结果参数并使每个递归调用创建一个本地列表并 return 它。