.for循环中的数组索引超出范围异常

时间:2019-08-18 09:51:30

标签: java arrays loops

Eclipse IDE抱怨使用/访问超出范围的书籍数组的for循环。它抱怨的行(19)是:         if(books [x] == null){

我不相信这是它抱怨的问题,因为我用很多不同的东西代替了代码,但它仍然在抱怨。一行是for循环的第一行,即         为(int x = 0; x <容量; ++ x)

我还三重检查条件是否正确,应该是。容量为5,这意味着对象位置的数组将位于0、1、2、3、4,因此从我对数组的了解来看,从0开始的x应该是正确的。

库类(带循环的库)

    package exercises;

    public class Library {
        private int capacity;
        private Book[] books = new Book[capacity];
        public Library(int capacity) {
            if (capacity > 1) {
                this.capacity = capacity;
            }
            else {
                this.capacity = 4;
            }
        }
        public boolean addBook(Book book) {
            int freeLocation = -1;
            @SuppressWarnings("unused")
            int notFreeLocation = -1;
            for (int x = 0; x < capacity ; ++x) {
                if (books[x] == null) { /*this is line 19*/
                    freeLocation = x;
                }
                else {
                    notFreeLocation = x;
                }
            }

            if (freeLocation == -1) {
                return false;
            }
            else {
                books[freeLocation] = book;
                return true;
            }
        }

图书馆应用类

    package exercises;

    public class LibraryApp {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Library library = new Library(5);
            library.addBook(new Book("The Lord of the Rings", "J. R. R. Tolkien"));
            library.addBook(new Book("Harry Potter and the Philosopher's Stone", "J. K. Rowling"));
            library.addBook(new Book("1984", "George Orwell"));
            library.addBook(new Book("Where the Wild Things Are", "Maurice Sendak"));
            library.addBook(new Book("The Hitchhiker's Guide to the Galaxy", "Douglas Adams"));
            System.out.println(library);
            Book aBook = library.borrow("1984");
            System.out.println("Book borrowed: " + aBook);
        }

    }

我得到了错误                 “线程“主”中的异常” java.lang.ArrayIndexOutOfBoundsException:0                     在Exercises.Library.addBook(Library.java:19)                     在演习中。LibraryApp.main(LibraryApp.java:8)

2 个答案:

答案 0 :(得分:3)

Library中完成此操作时:

private int capacity;
private Book[] books = new Book[capacity];

构造函数中的代码尚未运行(这些初始化在最开始的时候(或在子类中的super()之后插入)到构造函数中)。因此capacity有其默认值0后来您分配给capacity,但为时已晚。

相反:

public class Library {
    private int capacity;
    private Book[] books;                     // *** Don't initialize it here
    public Library(int capacity) {
        if (capacity > 1) {
            this.capacity = capacity;
        }
        else {
            this.capacity = 4;
        }
        this.books = new Book[this.capacity]; // *** Initialize it here
    }

但是这里还有另一件事需要学习。在遍历数组或类似数组时,请使用 array 的知识,而不要了解其他信息来源(capacity)。所以:

for (int x = 0; x < this.books.length ; ++x) {
// -----------------^^^^^^^^^^^^^^^^^

坚持真理的主要来源。 :-)(实际上,您可能根本不需要capacity实例成员。)

答案 1 :(得分:0)

您尝试制作一个大小为0(默认为int)的数组。 移动

private Book[] books = new Book[capacity];
在为容量分配值后,

向构造函数发送。