在类NullPointerException中实现一个类

时间:2015-05-04 12:35:57

标签: java class methods nullpointerexception

我在下面的行playlist1.firstSong = song;(第9行)中收到nullPointerException错误。有什么想法吗?

播放列表类:

public class Playlist { 
Scanner console = new Scanner(System.in); 
private Playlist playlist1=null, playlist2=null; 

private Song firstSong;
private Song secondSong;
private Song thirdSong;

public void setSong(Song song) { 
    if (song != null) {
        if (playlist1.firstSong == null) {
            playlist1.firstSong = song;
            System.out.println("The song has been added to the playlist.");
        }

        else if (playlist1.secondSong == null) {
            playlist1.secondSong = song;
            System.out.println("The song has been added to the playlist.");
        }

        else if (playlist1.thirdSong == null) {
            playlist1.thirdSong = song;
            System.out.println("The song has been added to the playlist.");
        }
        else {
            System.out.println("This playlist is currently full with 3 songs. Please delete a song before attempting to add a new one.");
        }
    }
   }

addSongToPlaylist方法:

private void addSongToPlaylist() { 
  if (songCount <=3) { 

    System.out.println("Please enter the number of the song you'd like to be added to the playlist."); 
    System.out.println("");

    database.Display();

    int songNumber; 
    songNumber = console.nextInt(); 

    switch (songNumber) { 
        case 1:
            playlist.setSong(database.getSong(1)); 
            break;
        case 2:
            playlist.setSong(database.getSong(2)); 
            break;
        case 3:
            playlist.setSong(database.getSong(3)); 
            break;
        case 4:
            playlist.setSong(database.getSong(4)); 
            break;
        default:
            System.out.println("Please enter a valid song number."); 
            break;
    }
    songCount++; 
  }

getSong方法:

public Song getSong(int songNumber) { 
    if (songNumber == 1){ 
        return song1; 
    }
    else if (songNumber == 2){ 
        return song2; 
    }
    else if (songNumber == 3){ 
        return song3; 
    }
    else if (songNumber == 4){ /
        return song4; 
    }

    else {
        return song1; 
}
}

非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:7)

因为您没有初始化播放列表对象。执行以下操作,

这样做。

   private Playlist playlist1= new PlayList(), playlist2=new Playlist(); 

而不是

   private Playlist playlist1=null, playlist2=null; 

修改

class listMenu {
 // class that contains 3 playlists object. 

PlayList list1 = new Playlist(), list2 = new Playlist(), list3 = new PlayList(); 

addPlayList() {
  // whatever your logic for addition is.
}

}

你做代码的方式是错误的,因为。

class PlayList {
 PlayList list1 = new PlayList(), list2 = new Playlist();
 private Song song1 = null;
 private Song song2 = null;
 private Song song3 = null; 

void setSong(Song song){
   list1.song1 = song; // you are storing song in  of list1.song field.
}
}

何时尝试访问该歌曲,您将再次获得NullPointerexception

class Menu{
 void main(// ) {
  PlayList list = new PlayList();
  list.setSong(new Song()); 
  list.getSong1.name(); // throw exception, because song is stored in the member object not in itselt. 



}
}

我希望你明白我的观点

答案 1 :(得分:3)

嗯......你在播放列表课上感到困惑。您的播放列表实际上存储了3首歌曲,您不需要使用播放列表1&amp; playlist2。 请尝试使用此代码:

public class Playlist { 
private Song firstSong;
private Song secondSong;
private Song thirdSong;

public void setSong(Song song) { 
    if (song != null) {
        if (this.firstSong == null) {
            this.firstSong = song;
            System.out.println("The song has been added to the playlist.");
        }

        else if (this.secondSong == null) {
            this.secondSong = song;
            System.out.println("The song has been added to the playlist.");
        }

        else if (this.thirdSong == null) {
            this.thirdSong = song;
            System.out.println("The song has been added to the playlist.");
        }
        else {
            System.out.println("This playlist is currently full with 3 songs. Please delete a song before attempting to add a new one.");
        }
    }
   }

认为在创建播放列表实例时,您可以在那里存储3首歌曲,就是这样。如果您想要更多播放列表,可以创建更多播放列表。

但如果您想存储超过3首歌曲怎么办?为此,您可以使用array重构代码(或者任何类型的存储,实际上)。让我们尝试使用Vector:

public class Playlist { 

private Vector<Song> songList;

public void setSong(Song song) { 
    if (song != null) {
             songList.add(song);
        }
   }
public Song getSong(int nb) {
    if (nb > 0 && nb < songList.size()) //We don't want to check the song #-1 or a song that would be out of bonds
         return songList.elementAT(nb);
}
 } 

你有更清洁的东西。 (上面的代码肯定有一些拼写错误,我不能在这里检查它们,但它就是一个例子。)

作为评论的答案: 如果你想使用2个播放列表,那很好,只需在你的主页中使用:

   Playlist firstPlaylist;
   Playlist secondPlaylist;

答案 2 :(得分:0)

我无法找到初始化播放列表对象的位置。您将其设置为null,但从不初始化它。

无论如何,最好检查playList对象是否为null,然后设置字段的值(firstSong)。