技术问题:仅能访问列表中的首个元素(附Catalogue类代码)
问题分析与修复方案
嘿,从你贴的Catalogue类代码来看,你遇到的“仅能访问列表首个元素”的问题,根源其实是代码里的几个小错误在搞鬼,咱们来一步步捋清楚:
1. 揪出核心错误
- 列表没初始化就用:你只声明了
booksAvailable这个列表,但没给它实例化(比如new LinkedList<>()或者new ArrayList<>()),直接调用add()方法会抛出NullPointerException——这会导致后续元素根本加不进去,搞不好程序直接崩溃,看起来就像只能拿到首个元素(实际上可能连首个都存不住)。 - 拼写失误:代码里有一行
boosAvailable.add(...),少了个k,应该是booksAvailable,这个错误会让第三本书《Terminator》根本没法被添加到可用列表里。 rentBook方法没干活:当前方法只是打印提示语,完全没实现查找、租借书籍的核心逻辑,自然没法正确访问列表里的元素。
2. 修复后的完整代码
import java.util.LinkedList; import java.util.List; import java.util.Scanner; // 补上假设你已经定义的Genre和Book类(如果没定义的话得加上) class Genre { private String name; public Genre(String name) { this.name = name; } } class Book { private String title; private int year; private Genre genre; private int copies; public Book(String title, int year, Genre genre, int copies) { this.title = title; this.year = year; this.genre = genre; this.copies = copies; } // 给个getter方法方便拿书名 public String getTitle() { return title; } } public class Catalogue { private List<Book> booksAvailable; private List<Book> booksRented; public Catalogue() { // 先初始化可用书籍列表!这里用LinkedList或者ArrayList都行 booksAvailable = new LinkedList<>(); booksAvailable.add(new Book("Matrix", 1999, new Genre("SciFi"), 3)); booksAvailable.add(new Book("Jurassic Park", 1999, new Genre("SciFi"), 3)); // 修复拼写错误 booksAvailable.add(new Book("Terminator", 1999, new Genre("SciFi"), 3)); booksRented = new LinkedList<>(); } public void rentBook() { System.out.println("Rent a book:"); System.out.println("Enter the title of a book you want to rent:"); // 加上实际的输入处理和租借逻辑 Scanner scanner = new Scanner(System.in); String targetTitle = scanner.nextLine().trim(); // 遍历所有可用书籍,找到匹配的那本 for (Book book : booksAvailable) { if (book.getTitle().equalsIgnoreCase(targetTitle)) { booksAvailable.remove(book); booksRented.add(book); System.out.println("Successfully rented: " + book.getTitle()); scanner.close(); return; } } System.out.println("Sorry, that book isn't available right now."); scanner.close(); } // 加个测试方法,验证能不能访问所有元素 public static void main(String[] args) { Catalogue catalogue = new Catalogue(); System.out.println("All available books:"); // 遍历打印所有可用书籍,证明能访问每个元素 for (int i = 0; i < catalogue.booksAvailable.size(); i++) { System.out.printf("%d. %s%n", i+1, catalogue.booksAvailable.get(i).getTitle()); } catalogue.rentBook(); } }
3. 正确访问列表元素的几种方式
修复之后,你想怎么访问列表里的元素都行:
- 遍历所有元素:用增强for循环(
for (Book book : booksAvailable)),挨个过一遍列表里的每本书。 - 按索引取元素:如果用的是
ArrayList这种支持索引的列表,直接用booksAvailable.get(index)——比如booksAvailable.get(1)就能拿到第二本书(索引从0开始哈)。 - 找特定元素:通过书籍的属性(比如书名)遍历列表,匹配到目标元素后再操作,就像
rentBook方法里做的那样。
小提示
- 记得给
Book和Genre类加必要的getter/setter方法,不然在Catalogue里没法访问它们的属性。 - 处理用户输入的时候,可以加些异常捕获逻辑,比如防止输入空字符串啥的,让程序更健壮。
内容的提问来源于stack exchange,提问作者Pramish Luitel
相关产品推荐
相关产品推荐

