2012-04-29 4 views
2

Я создаю программу, которая принимает ряд чисел и добавляет минимальную пару этих чисел. Код ошибки:java throwing exception java.lang.IndexOutOfBoundsException:

import java.util.*; 

public class Library { 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     String answer; 
     int count; 
     int books; 
     int writers; 
     List<Integer> booksList = new LinkedList<>(); 
     System.out.printf("Numbers: "); 

     answer = input.nextLine(); 
     String[] arr = answer.split(" "); 

     for (String num : arr) { 
      booksList.add(Integer.parseInt(num)); 
     } 

     books = booksList.remove(0); 
     writers = booksList.remove(0); 

     while (booksList.size() > writers) { 
      mergeMinimalPair(booksList); 
     } 
    } 

    public static void mergeMinimalPair(List<Integer> books) { 
     int index = 0; 
     int minValue = books.get(0) + books.get(1); 

     for (int i = 1; i <= books.size() - 1; i++){ 
      if ((books.get(i) + books.get(i + 1)) < minValue){ 
       index = i; 
       minValue = books.get(i) + books.get(i + 1); 
      } 
     } 
     //combine(books, index, index + 1); 
    } 

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

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7 
    at java.util.LinkedList.checkElementIndex(LinkedList.java:553) 
    at java.util.LinkedList.get(LinkedList.java:474) 
    at Library.mergeMinimalPair(Library.java:40) 
    at Library.main(Library.java:29) 
Java Result: 1 

Как избежать этого исключения?

ответ

2

Проблема здесь:

for (int i = 1; i <= books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1)) < minValue){ 
     index = i; 
     minValue = books.get(i) + books.get(i + 1); 
    } 
} 

Вы итерацию до books.size() - 1. Когда i точно соответствует books.size() - 1, i + 1 равен books.size(), который считается за пределами books.get(i + 1). Fix:

for (int i = 1; i < books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1)) < minValue){ 
     index = i; 
     minValue = books.get(i) + books.get(i + 1); 
    } 
} 
2

В коде

for (int i = 1; i <= books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1) 

Наибольшее значение для I является book.size() - 1 но books.get(i + 1) этот показатель слишком велик.

Самое простое изменение

for (int i = 1; i < books.size() - 1; i++){ 
2

Ваш цикл переходит от 1 к books.size() - 1, вместо того, чтобы идти от 0 к books.size() - 2. Индексы массивов и коллекций всегда идут от 0 (включены) до размера (исключаются) в Java.