如何避免"线程中的异常" main" java.util.ConcurrentModificationException" Java

时间:2016-02-26 08:17:28

标签: java exception

我正在尝试计算Standerd Deviation,平均avarage等。我正在尝试编写下面的代码。但它会引发异常 java.util.ConcurrentModificationException 。我正在尝试修复它,但它会失败。

我的代码:

package statistic;

import java.util.*;

public class StanderDeviation {

    public static void main(String[] args) {

        System.out.println("step 1:create a list of 10 numbers :");

        List<Double> numbers = new ArrayList<Double>();
        numbers.add(23.0);
        numbers.add(92.0);
        numbers.add(46.0);
        numbers.add(55.0);
        numbers.add(63.0);
        numbers.add(94.0);
        numbers.add(77.0);
        numbers.add(38.0);
        numbers.add(84.0);
        numbers.add(26.0);
        System.out.println("\n " +numbers);

        System.out.println("step 2: average  of 10 numbers : ");

        double sum = 0;
        for(double number : numbers)
        {
            sum= sum +number;
        }
        double average = sum / numbers.size();
        System.out.println(sum + " / " + numbers.size() + " = " + average);

        System.out.println("\nstep 3: difference between each number numbers and average :");

        List<Double>listOfDifferences = new ArrayList<Double>();
        for(double number : numbers)
        {
            double difference = number - average ;
            listOfDifferences.add(difference);
            System.out.printf("%2.2f", difference);
            System.out.printf(" "); 
        }


         System.out.println("\n\nstep 4: Square of above calculate difference :");

        List<Double> squares = new ArrayList<Double>();
        for(double difference : listOfDifferences)
        {
            double square = difference * difference ;
            listOfDifferences.add(difference);
            squares.add(square);
            System.out.printf("%4.2f", square);
            System.out.printf(" "); 
        }
        System.out.println("\nstep 5:sum of Square   calculate above :");

        sum = 0;
        for(double number : squares)
        {
            sum += number ; 
        }
        System.out.println(sum);
        System.out.println();

        System.out.println("step 6: divide sum of Square by totle (numbers)-1 :");

        double result = sum / (numbers.size()-1);
        System.out.printf("%4.2f", result);
        System.out.println();

        System.out.println("\nstep 7: Stander Deviation is the Square root of obove result :");

        double StanderDeviation = Math.sqrt(result);
        System.out.printf("%4.2f", StanderDeviation);
    }
}

以下是执行错误

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at statistic.StanderDeviation.main(StanderDeviation.java:50)

提前致谢。

2 个答案:

答案 0 :(得分:1)

你的问题在于这个循环:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *a;
    int *b;
    a=malloc(sizeof(int));
    //b=malloc(sizeof(int));
    int c=6;
    a=&c;
    b=a;
    printf("%d\n",*b);
    return 0;
}

您正在尝试将某些内容添加到您当前正在迭代的列表中!

只需删除行for(double difference : listOfDifferences) { double square = difference * difference ; listOfDifferences.add(difference); squares.add(square); System.out.printf("%4.2f", square); System.out.printf(" "); }

它不会影响您对标准偏差的计算。 (将您刚从列表listOfDifferences.add(difference);收到的difference再次添加回同一列表并不合理!)

答案 1 :(得分:1)

您可以创建其他List结构( ,如果您确实需要 )并添加元素,如:

   List<Double> changed = new ArrayList<Double>();

        for(double difference : listOfDifferences)
        {
            double square = difference * difference ;
//            listOfDifferences.add(difference);
            squares.add(square);
            changed.add(difference);
            System.out.printf("%4.2f", square);
            System.out.printf(" ");
        }

无法修改您迭代的Collection

ConcurrentModificationException Oracle doc.