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)
答案 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];
在为容量分配值后,向构造函数发送。