【问题标题】:ArrayList wont display its elementsArrayList 不会显示其元素
【发布时间】:2019-03-21 07:29:08
【问题描述】:

这是我的对象类:

public class Book {

   private String title;
   private int year;

   public Book(String title, int year){
      title = this.title;
      year = this.year;
   }

    public String getTitle(){return title;}
    public int getYear(){return year;}

    public String toString(){return (title + "\t" + year);}
}

应用程序类将从 BookInput.txt 中读取,其中已经包含书名和出版年份的数据,并将数据传输到名为 BookList 的数组列表中。一本书的标题及其出版年份将记录在一个索引中(这意味着一个索引中有两个数据,一个字符串和一个整数)

这是我的应用程序类:

    ArrayList <Book> BookList = new ArrayList();
    BufferedReader br = new BufferedReader (new FileReader ("bookInput.txt"));

    String str = br.readLine();
    while (str!=null){
        StringTokenizer st = new StringTokenizer(str,";");
        String title = st.nextToken();
        String yr = st.nextToken();
        int year = Integer.parseInt(yr);
        Book b1 = new Book (title,year);
        BookList.add(b1);
        str = br.readLine();
    }
    br.close();

    for (int i = 0; i < BookList.size(); i++){
        Book b2 = BookList.get(i);
        System.out.println("#" + (i+1) + " " + b2.getTitle() + " , " + b2.getYear());
    }

对于所有标题,我的显示将显示为 null,对于所有发布年份显示为 0。它可以编译没有任何错误。

【问题讨论】:

  • 尤其是刚开始学习的时候:试着正确开始。不要使用 StringTokenizer。此类已被弃用多年,不应使用。改用String类的split方法
  • this 是实际实例(不是方法); this.title 是实例的标题字段而不是方法的参数...所以title = this.title 是设置参数而不是实例字段

标签: java arraylist


【解决方案1】:

您必须反过来设置对象的属性,您可以考虑将私有字段设置为final(在这种情况下,如果最终值未在构造函数中正确初始化,则会出现编译错误):

private final String title;
private final int year;

public Book(String title, int year){
   this.title = title;
   this.year = year;
}

【讨论】:

  • 将它们标记为 final 可能会导致此类或子类不应该是不可变的问题
  • Final 是可选的,但有助于找到这样的错误
  • @Stultuske 私有字段对子类不可见。
  • @ttulka 并不意味着原始类将来不能有受保护的范围设置器。
  • @Stultuske 当然,但在这种情况下不是。我发现不变性是一种很好的做法。无论如何,感谢您的评论 - 这是设计课程时需要考虑的事情。
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 2017-02-13
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多