You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问题:仅能访问列表中的首个元素(附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:02