그래서 나는 다음과 같은 런타임 오류가 점점 오전 : 이제해, ConcurrentModificationException
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.getAnswers(Solution.java:53)
at Solution.getAnswers(Solution.java:44)
at Solution.getAnswers(Solution.java:44)
at Solution.getEquations(Solution.java:28)
at Solution.main(Solution.java:22)
나는 예외에 읽어하고 내 지식 내가 실행하지 않기 때문에, 무슨 일이 일어나고 이유에로 혼란 스러워요을 모든 비동기 코드. 나는 배열리스트가 쓰레드에 안전하지 않다는 것을 안다.하지만 목록에 값을 추가하는 것이 왜 문제가되는지 확신 할 수 없다. 또한 재귀를 사용하여 동시성 문제가 발생할 것이라고 생각하지 않았습니다.
문제에 대해 어느 정도 밝혀 낼 수 있다면 왜 그런 일이 일어나고 있는지 많은 의견을 듣겠습니다! 내 코드는 아래에 있으며 코드의 끝에있는 재귀 메서드에서 오류가 발생한다고 생각합니다.
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
long result = getEquations(a,b);
System.out.println(result);
}
private static long getEquations(int a, int b) {
ArrayList<Integer> answers = new ArrayList<Integer>();
getAnswers(a,b,answers);
return answers.stream().mapToInt(x->x).distinct().count();
}
private static void getAnswers(int a, int b, ArrayList<Integer> answers){
if(a==0 && b==0) return;
if(a==1 && b == 0) {
answers.add(1);
return;
}
if(a==0 && b == 1) {
answers.add(2);
return;
}
if(a>0){
a-=1;
getAnswers(a,b,answers);
for(Integer value : answers){
answers.add(1+value);
answers.add(1*value);
}
return;
}
if(b>0){
b-=1;
getAnswers(a,b,answers);
for(Integer value : answers){
answers.add(2+value);
answers.add(2*value);
}
return;
}
}
}