Java错误排查:array reference expected及addBookToLibrary方法问题求助
分析你的代码问题与错误原因
咱们一步步拆解你代码里的问题,包括你碰到的array reference expected错误,还有方法逻辑不符合需求的地方:
1. 循环范围错误引发数组越界(可能是你遇到的错误来源)
你写的循环条件是for (int i = 0; i <= bookCapacity; i++),这里有两个关键问题:
- Java数组的索引是从
0到bookCapacity - 1的(毕竟bookCapacity是数组总长度),当i等于bookCapacity时,访问booksArray[i]就会超出数组合法范围,触发ArrayIndexOutOfBoundsException,这类数组访问错误很可能就是你描述的array reference expected。 - 你根本不需要遍历整个数组容量,只需要遍历已存在的图书(也就是
bookCounter数量的元素),所以循环条件应该改成i < bookCounter。
2. 对象比较逻辑错误:用==而非equals()
你用booksArray[i]==book判断图书是否存在,这在Java里是不对的:
==比较的是对象的内存引用地址,只有两个变量指向同一个对象实例时才会返回true。- 如果是两本内容完全相同但不同实例的
Book,==会误判为不存在。正确做法是用equals()方法(记得要在Book类中重写equals()和hashCode(),不然默认还是比较引用),比如:if (booksArray[i].equals(book)) { found = true; break; // 找到后直接跳出循环,省时间 }
3. 返回值完全不符合需求定义
题目要求:
- 成功添加或已存在时返回非负ID
- 无剩余空间时返回负数
但你的代码直接返回bookCounter,这完全不达标:
- 成功添加时,新图书的ID应该是它在数组中的索引——添加前
bookCounter是当前已有图书数量,把书放到booksArray[bookCounter]后,bookCounter才加1,所以新图书的ID是bookCounter(添加前的数值)。 - 如果图书已存在,你需要返回该图书的索引(ID),而不是当前的
bookCounter。 - 当没有剩余空间(
bookCounter >= bookCapacity)时,必须返回负数(比如-1)。
4. 未提前终止循环,效率低下
当找到已存在的图书时,应该立即用break终止循环,没必要继续遍历剩下的元素,减少不必要的计算。
修正后的参考代码
给你一个符合需求的修正版本:
int addBookToLibrary(Book book) { // 先检查图书是否已存在,同时记录它的ID int existingId = -1; for (int i = 0; i < bookCounter; i++) { // 前提是Book类已正确重写equals方法 if (booksArray[i].equals(book)) { existingId = i; break; } } // 如果已存在,直接返回它的ID if (existingId != -1) { return existingId; } // 检查图书馆是否还有剩余空间 if (bookCounter >= bookCapacity) { // 无空间,返回负数 return -1; } // 添加图书并返回新的ID booksArray[bookCounter] = book; int newBookId = bookCounter; bookCounter++; return newBookId; }
内容的提问来源于stack exchange,提问作者papi
相关产品推荐
相关产品推荐

