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

Task类存入List后打印显示异常,如何实现正常展示与持久化?

问题描述

我想开发一个任务管理器作为练手项目,但遇到了问题。我定义了如下Task类:

public Task(int id, String title, String description, LocalDate dueDate, boolean status) {
        this.id = id;
        this.title = title;
        this.description = description;
        this.dueDate = dueDate;
        this.status = false;
    }

希望将Task实例添加到List中并保存到文本文件。但将Task加入List后打印时,输出的是类似Task@1ddc4ec2的内容,无法看到任务的详细信息。我不确定是否可以这样将类存入List,也不知道该如何解决,希望得到建议。

我创建任务的代码如下:

tm.addTask(new Task(1, "First Try",
                  "My first try to add a task",
                   LocalDate.now(), false));

tm.addTask(new Task(2, "Second add",
                  "The second task I'm adding.",
                   LocalDate.now(), false));

打印代码为:

System.out.println("All tasks in the list: " + tm.tasks);

我有一个独立的TaskManager类(实例为tm),其中包含名为tasks的列表。我期望看到每个任务的所有详细信息,但得到的输出却是All tasks in the list: [Task@9807454, Task@1ddc4ec2]。


解决方案

首先明确:完全可以把自定义类的实例存入List,你遇到的问题只是Java默认的对象打印逻辑导致的。

1. 重写Task类的toString()方法

Java中打印对象时,默认调用Object类的toString()方法,输出格式为类名@哈希码。要显示任务的详细信息,必须在Task类中重写这个方法,返回包含任务属性的可读字符串。

示例代码:

import java.time.LocalDate;

public class Task {
    private int id;
    private String title;
    private String description;
    private LocalDate dueDate;
    private boolean status;

    public Task(int id, String title, String description, LocalDate dueDate, boolean status) {
        this.id = id;
        this.title = title;
        this.description = description;
        this.dueDate = dueDate;
        this.status = false;
    }

    // 重写toString(),自定义输出格式
    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", description='" + description + '\'' +
                ", dueDate=" + dueDate +
                ", status=" + (status ? "已完成" : "未完成") +
                '}';
    }

    // 为后续保存文件添加getter方法,方便读取属性
    public int getId() { return id; }
    public String getTitle() { return title; }
    public String getDescription() { return description; }
    public LocalDate getDueDate() { return dueDate; }
    public boolean isStatus() { return status; }
}

重写后,直接打印tm.tasks就会输出每个任务的详细属性。

2. 关于将Task保存到文本文件的建议

如果要把列表中的Task实例保存到文本文件,有两种实用方式:

  • 方式一:基于字符串写入:遍历List,将每个Task的属性用分隔符(比如|)拼接成字符串,每行写入一个任务。读取时按分隔符拆分字符串,重新构建Task实例。这种方式的文件是可读文本,便于调试。
  • 方式二:对象序列化:让Task类实现Serializable接口,使用ObjectOutputStream将整个List写入文件,读取时用ObjectInputStream恢复。这种方式适合复杂对象,但文件是二进制格式,无法直接查看。

示例代码(方式一,写入文本文件):

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class TaskManager {
    private List<Task> tasks;

    // 省略addTask等已有方法

    public void saveTasksToFile(String filePath) throws IOException {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            for (Task task : tasks) {
                String line = task.getId() + "|" 
                        + task.getTitle() + "|" 
                        + task.getDescription() + "|" 
                        + task.getDueDate() + "|" 
                        + task.isStatus();
                writer.write(line);
                writer.newLine();
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Valle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:15:01