2014-11-05 3 views
0

Мы создаем файл ArrayList из файла, который содержит как целые числа (показания одометра), так и парные (галлоны за заполнение). Мы используем их, чтобы сделать пробег. Затем мы используем класс контейнера для доступа к ним, так далее и так далее.Ошибка с/использованием ArrayList

Контейнер выглядит следующим образом:

package lab08; 

public class FillUp{ 
    private final int odometer; 
    private final double gallons; 


    public FillUp(int givenOdometer, double givenGallons){ 
    odometer = givenOdometer; 
    gallons = givenGallons; 
    } 

public int getOdometer(){ 
return odometer; 
} 

public double getGallons(){ 
return gallons; 
} 

}

Мой код выглядит следующим образом:

public class MileageCalculator {  

    public static void main(String[] args) throws FileNotFoundException{ 
     Scanner scan = new Scanner(new File("/Users/Mobile_Hive/Desktop/Homework/mileage.txt")); 
      double mileage=0.0; 
      int i=0; 
      System.out.println(fillUpArray(scan).get(0)); 
      /** 
      while(i+1<fillUpArray(scan).size()){ 
       mileage=(((FillUp)fillUpArray(scan).get(i+1)).getOdometer()-((FillUp) fillUpArray(scan).get(i)).getOdometer())/((FillUp) fillUpArray(scan).get(i+1)).getGallons(); 
       System.out.println("Mileage: "+mileage); 
       i++; 
      } 
      **/ 
     } 
    private static ArrayList<FillUp> fillUpArray(Scanner scan){ 
     ArrayList<FillUp> list = new ArrayList<FillUp>(); 
     int odometer=0; 
     double gallons=0.0; 
     while(scan.hasNextLine()){ 
     String line = scan.nextLine(); 
     Scanner scans = new Scanner(line); 
     while(scans.hasNext()){ 
      odometer=scans.nextInt(); 
      gallons=scans.nextDouble(); 
     } 
     FillUp fill = new FillUp(odometer, gallons); 
     list.add(fill); 
     } 
     return list; 
    } 

Я использую комментарии для закупоривания от моего метода для получения фактической пробег и попытка увидеть, могу ли я даже получить доступ к индексам ArrayList, которые я пытался сделать .... Когда я запускаю это в своей текущей форме, я получаю :

[email protected] 

Когда я удаляю комментарии вокруг «в то время как (я + 1 <) и т.д.» приводит к «я ++» я получаю:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 
at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
at java.util.ArrayList.get(ArrayList.java:411) 
at lab08.MileageCalculator.main(MileageCalculator.java:15) 

Я чувствую, как в первом случае, я не доступ к индексу списка массивов, почти так же, как он не был заполнен. Во второй попытке я не совсем уверен, что происходит. Я не ищу прямых ответов, но, возможно, просто объясню, что происходит с очень урезанными инструкциями о том, что должно произойти. Я также хотел бы получить информацию о том, что происходит, если кто-то может подтолкнуть меня к некоторому материалу для чтения, который был бы потрясающим.

+0

Переопределить toString в классе FillUp. – user2336315

+0

Да, вы печатаете первый элемент списка, который является «FillUp». Но вы не переопределили 'toString()' в классе 'FillUp', поэтому вы получаете такой вывод ... Для вашего цикла получите' ArrayList' * один раз * вместо вызова 'fillUpArray' в ваш цикл. –

ответ

1

Каждый раз, когда вы звоните fillUpArray(scan), вы получаете другой ArrayList, размер которого может отличаться от того, что вы получили в предыдущем вызове этого метода. Вы должны вызвать этот метод один раз и сохранить его вывод в переменной, чтобы вы использовали тот же список.

 List list = fillUpArray(scan); 
     System.out.println(list.get(0)); 
     while(i+1<list.size()){ 
      mileage=(((FillUp)list.get(i+1)).getOdometer()-((FillUp) list.get(i)).getOdometer())/((FillUp) list.get(i+1)).getGallons(); 
      System.out.println("Mileage: "+mileage); 
      i++; 
     } 
+0

дал эту попытку, получив эту ошибку .... Еще раз, я чувствую, что List не заполняется и не заполняется правильно .... Исключение в теме "main" java.lang.IndexOutOfBoundsException: Index: 0, Size : 0 \t в java.util.ArrayList.rangeCheck (ArrayList.java:635) \t в java.util.ArrayList.get (ArrayList.java:411) \t на lab08.MileageCalculator.main (MileageCalculator.java: 17) Кроме того, с СОП он печатает так же, как и раньше, [email protected] что я чувствую, что мне нужно добавить ToString .... – Loomiss

+0

@Loomiss Был еще один звонок для заполненияUpArray внутри цикла, который я забыл заменить. Если вы его не заменили, это может объяснить ошибку. См. Мое редактирование. – Eran

+0

Большое спасибо, он работает сейчас. Я знаю, что происходит (как и все команды и т. Д.), Я просто не мог понять особенности ошибки, которая меня расстраивала. Я также на ограниченной лимитированной линии времени (Recert'ing моей лицензии медицинской армии всю неделю ...) можете ли вы указать мне на хорошую/углубленную статью/источник для чтения на ArrayList/Arrays в целом, чтобы убедиться, что я есть хорошие базовые знания по этому поводу? – Loomiss

Смежные вопросы