2014-11-18 4 views
2

Я пишу программу, которая считывает числа из файла и вычисляет их среднее значение. Тем не менее, я получаю ошибку, показанную ниже во время выполнения. Я попытался исправить это, используя литье, чтобы удвоить, как показано в коде, но это не помогло.Java arraylist, получающий элемент для вычисления среднего значения

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at ReadFile.main(ReadFile.java:34) 
    at __SHELL40.run(__SHELL40.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774) 
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at ReadFile.main(ReadFile.java:34) 
    at __SHELL41.run(__SHELL41.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774) 
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at ReadFile.main(ReadFile.java:33) 
    at __SHELL42.run(__SHELL42.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774) 
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at ReadFile.main(ReadFile.java:33) 
    at __SHELL43.run(__SHELL43.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774) 

Код:

import java.io.*; 
import java.util.Scanner; 
import java.util.ArrayList; 

public class ReadFile 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      Scanner input = new Scanner("n.txt"); 
      File file = new File(input.nextLine()); 
      input = new Scanner(file); 
      ArrayList numbers = new ArrayList(); 

      int index=1; 

      while (input.hasNextLine()) { 
       String line = input.nextLine();; 
       numbers.add(line); 
       System.out.println(index + " : " + line); 
       index++; 
      } 
      input.close(); 

      double sum = 0.0; 
      double average; 
      for (int j = 0; j < numbers.size(); j++) 
      { 
       sum = sum + (double) numbers.get(j) ; //My guess is that this line is invoking the error 

      } 
      average = sum/numbers.size(); 
      System.out.println(average); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

ответ

4

Список numbers содержит String объекты, поэтому отливать элементы для double сгенерирует исключение. Вы могли бы избежать этого во время выполнения исключение, если вы использовали общий тип ArrayList правильно:

ArrayList<String> numbers = new ArrayList<String>(); 

Это позволит компилятору обнаруживать загодя типа несовместимости.

Чтобы прочитать двойное значение строки, вы можете использовать Double#parseDouble(String):

sum = sum + Double.parseDouble(numbers.get(j)); 

В качестве альтернативы вы можете изменить тип параметра из numbers в Double и преобразовать значение при добавлении элемента в список:

ArrayList<Double> numbers = new ArrayList<Double>(); 

... 
numbers.add(Double.parseDouble(line)); 
Смежные вопросы