2012-04-29 139 views
2

我正在创建一个程序,它需要一系列数字并添加这些数字的最小对数。失败代码如下:java抛出异常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)时,这被认为是出界。修复:

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() - 1books.get(i + 1)这个指数是太大。

最简单的变化是

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

你的循环从1去而不是去从0books.size() - 2books.size() - 1。 Java中的数组和索引总是从0(包含)到size(不包括)。