导致这个空指针异常的原因是什么?

时间:2015-05-28 17:07:37

标签: java arrays nullpointerexception

我正在尝试将歌曲添加和删除功能用于假设的歌曲数据库的假设播放列表。

我第一次调用deleteSong()函数从播放列表对象中删除一首歌时效果很好。第二次调用该函数时,在选择播放列表的索引以从中删除歌曲时,它会尝试运行selectSong()函数,启动for循环以打印每首歌曲,但显然是{{1} }数组变为空值,或者至少元素0为空,因为它在第一次迭代(songs[])时抛出NullpointerException

i = 0变量非常自我解释。它跟踪阵列中有多少实际初始化的Song对象。

注意:这基本上是复制/粘贴代码,因为我的播放列表对象(添加和删除播放列表)具有相同的功能,我没有遇到过这个问题。

以下是方法:

logicalSize

添加歌曲的代码:

public void deleteSong(int index){
    System.out.println("[INFO] Deleting the selected song...");
    Song[] tempSongs = new Song[songs.length-1];
    tempSongs[tempSongs.length-1] = new Song();
    if (index+1 > songs.length-1){
      System.out.println("[INFO] Song item is last element.");
      for (int i=0;i<tempSongs.length;i++){
          tempSongs[i] = songs[i];
      }
    } else {
      //songs[index+1] = songs[index];
      for (int i=index;i<tempSongs.length;i++){
        if (i == index){
            System.out.println("[INFO] Song: skip index to remove");
        } else {
            tempSongs[i] = songs[i+1];
        }
      }    
  }

  songs = tempSongs;
  logicalSize--;
}

selectSong()函数:

public void addSong(Song song)
{

    songs[logicalSize] = new Song();
    songs[logicalSize]= song;
    logicalSize++;
    songCount++;

}

2 个答案:

答案 0 :(得分:0)

您将newsongs初始化为一个充满null歌曲引用的数组。然后,如果您没有删除最后一首歌曲,则只需开始在newsongs位置初始化index+1。所有先前的条目仍为空。

除非这是一项任务或学习练习,否则你真的应该学习Java的List类型及其实现。 Here是Java 7 javadoc。

答案 1 :(得分:0)

为什么不尝试使用ArrayList

您可以定义歌曲的ArrayList并使用方法yourList.add()yourList.remove()。您可以删除带有索引或对象的项目

会是这样的

ArrayList<Song> yourList = new ArrayList¸<Song>();

ArrayList Oracle

public E remove(int index)
public boolean remove(Object o)