【问题标题】:NullPointerException on getter吸气剂上的 NullPointerException
【发布时间】:2014-12-06 13:03:47
【问题描述】:

我正在准备期末考试。它应该是一个“媒体库”,用于存储有关个人媒体(DVD、游戏等)的信息,除此之外它应该接收新的媒体项目,将它们存储到数组中并在出现提示时显示它们。它完成了所有这些,但是当它显示时,它在 getter 上有一个 NullPointerException,即使它按照我的意图执行它。

public class MediaItem {
private String title;
private String format;
private boolean onLoan;
private String loanedTo;
private String dateLoaned;

public MediaItem(){
    title = null;
    format = null;
    onLoan = false;
    loanedTo = null;
    dateLoaned = null;

}

public MediaItem(String title, String format){
    this.title = title;
    this.format = format;
    onLoan = false;

}

上面是创建“MediaItems”的类的字段和构造函数,我们被告知要调用它们

下面是另一个类的一部分,即库本身。一个数组用于存储媒体项,一个数组用于打印列表。还有 add 方法以及我如何将它们添加到数组中。

private MediaItem[] items = new MediaItem[100];
private String[] listOfItems = new String[100];
private int numberOfItems = 0;  

public void addNewItem(String title, String format){
    MediaItem item = new MediaItem(title, format);
    items[numberOfItems] = item;
    numberOfItems++;
}

这是我遇到问题的部分

    public void listAllItems(){
    for (int i = 0; i < items.length; i++){
        System.out.println(items[i].getTitle());
    }   
    }

这不是它应该做的,但我目前的问题是它确实打印出了整个项目列表,但也给出了 NullPointerException,我不知道为什么。被调用的 getter 是一个基本的 eclipse 生成的 getter

    public String getTitle() {
    return title;
    }

这是一个我粗糙的 Java,所以我是新手,所以请温柔。我相信这是所有相关的部分,所以任何帮助表示赞赏!

【问题讨论】:

  • items[i] 对于i 的某个值肯定为空。如果你不调用addNewItem 100 次,这行代码总会有一个 NPE。

标签: java arrays oop nullpointerexception getter


【解决方案1】:

items.length 将始终是整个数组的长度(在您的情况下为 100),无论您实际添加了多少项。试试这样:

public void listAllItems(){
  for (int i = 0; i < numberOfItems; i++){
    System.out.println(items[i].getTitle());
  }   
}

你的问题不是getter本身,而是试图在null上调用getTitle()方法。

【讨论】:

  • 非常感谢。我不敢相信我没有注意到这一点,并且可以发誓我以前尝试过这种方法无济于事,上面的方法正是如此,但确实新鲜的眼睛可以改变世界。再次感谢您。
【解决方案2】:

您确实保留了 100 个位置,但我怀疑并非所有位置都已被占用。这会在访问这些元素的属性时导致 NullPointerException。

您可以使用以下方法从数组中获取所有非空元素:

public void listAllItems(){
  int i = 0;
  while (i < numberOfItems){
    if (items[i] != null) // Null check
      System.out.println(items[i].getTitle());
    i+=1;
  }   
}

或者使用相同的“for”循环只进行空检查也应该足够了:

public void listAllItems(){
   for (int i = 0; i < numberOfItems; i++) {
    if (items[i] != null)
      System.out.println(items[i].getTitle());
   }     
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 2018-04-05
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2019-11-26
    • 2014-02-24
    • 2021-11-05
    相关资源
    最近更新 更多