2016-02-26 76 views
2

我想计算标准偏差,平均avarage等我试图写下面的代码。但它会抛出异常java.util.ConcurrentModificationException。我尝试修复它,但是显示为faild。如何避免“线程中的异常”main中的“java.util.ConcurrentModificationException”Java中的错误

我的代码:

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

这里是exeption错误提前

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) 

感谢。

+0

请勿修改您通过添加或删除这些项目遍历列表。 –

+0

对不起,我不明白。我是新的Java。你能解释一下吗? – Faisal

+0

Hope [this](http://stackoverflow.com/a/8189786/3288182)帮助 – Scar

回答

1

你的问题就出在这个循环中:

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你只是从列表中listOfDifferences回到同一列表收到了!)

+0

非常感谢 – Faisal

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.

相关问题