将歌曲添加到普通播放列表中为什么会出现空指针异常

将歌曲添加到普通播放列表中为什么会出现空指针异常

package com.imooc.test;

import java.util.InputMismatchException;

import java.util.Iterator;

import java.util.List;

import java.util.Scanner;

import java.util.Map.Entry;


import com.imooc.player.PlayList;

import com.imooc.player.PlayListCollection;

import com.imooc.player.Song;

public class Test2 {


//主菜单

public void mainMenu() {

System.out.println("***************************************\r\n" + 

"               **主菜单**\r\n" + 

"               1--播放列表管理\r\n" + 

"               2--播放器管理\r\n" + 

"               0--退出\r\n" + 

"***************************************\r\n" + 

"请输入对应数字进行操作:");

}

//播放器菜单

public static void playerMenu() {

System.out.println("***************************************\r\n" + 

"               **播放器管理**\r\n" + 

"               1--向播放器添加播放列表\r\n" + 

"               2--从播放器删除播放列表\r\n" + 

"               3--通过名字查询播放列表信息                \r\n" + 

"               4--显示所有播放列表名称\r\n" + 

"               9--返回上一级菜单\r\n" + 

"***************************************");

System.out.println("请输入对应的数字对播放器进行管理:");

}

//播放列表管理菜单

public static void playListMenu() {

System.out.println("***************************************\r\n" + 

"           **播放列表管理**\r\n" + 

"           1--将歌曲添加到主播放列表\r\n" + 

"           2--将歌曲添加到普通播放列表\r\n" + 

"           3--通过歌曲id查询播放列表中的歌曲\r\n" + 

"           4--通过歌曲名称查询播放列表中的歌曲\r\n" + 

"           5--修改播放列表中的歌曲\r\n" + 

"           6--删除播放列表中的歌曲\r\n" + 

"           7--显示播放列表中的所有歌曲\r\n" + 

"           8--导出歌单\r\n" + 

"           9--返回上一级菜单\r\n" + 

"***************************************\r\n" + 

"请输入对应的数字对播放列表进行管理:");

}



/*

* 主流程实现

*/

public static void main(String[] args) {

PlayListCollection plc=new PlayListCollection();//播放器  

PlayList pl=new PlayList("主播放列表",null);  

plc.getPlayListMap().put("主播放列表", pl);

   TestDemo user=new TestDemo();

Scanner sc=new Scanner(System.in);

int n=0;

while(true) {

user.mainMenu();

       n=sc.nextInt();

       switch(n) {

       case 1:

boolean flag=false;//返回菜单标志,false不返回

n=0;

   while(true) {

playListMenu();

n=sc.nextInt();

switch(n) {

case 1://将歌曲添加到主播放列表    

  System.out.println("将歌曲添加到主播放列表");

      System.out.println("请输入要添加的歌曲的数量:");       

      int num=sc.nextInt();

      for(int i=1;i<=num;i++) {

     System.out.println("请输入第"+i+"首歌曲:");

     System.out.println("请输入歌曲的id:");

     String id=sc.next();

     System.out.println("请输入歌曲的名称:");

     String name=sc.next();

     System.out.println("请输入演唱者:");

     String singer=sc.next();

     Song song=new Song(id,name,singer);      

     pl.addToPlayList(song);      

     }

         System.out.println("添加成功!");

  break;


case 2://将歌曲添加到普通播放列表

    System.out.println("将输入要添加的播放列表名称:");       

        String listname=sc.next();

/*判断播放列表是否存在*/if(plc.getPlayListMap().containsKey(listname)) {

        System.out.println("请输入要添加的歌曲的数量:");

    int num1=sc.nextInt();

    for(int i=1;i<=num1;i++) {

    System.out.println("请输入第"+i+"首歌曲:");

    System.out.println("请输入歌曲的id:");

    String id=sc.next();

    //查找id对应歌曲是否存在

    boolean flag1=false;//标志:初始为false表示在主播放列表中没找到

    for(int j=0;j<pl.getMusicList().size();j++) {

    if(id.equals(((Song)(pl.getMusicList().get(j))).getId())) {

    flag=true;//找到了

    break;

    }

    }

    //若有此歌曲,则省略后续步骤,否则继续输入信息

    if(flag) {

    Song song=new Song(id,(pl.searchSongById(id)).getName(),(pl.searchSongById(id)).getSinger());

        new PlayList().addToPlayList(song);

    continue;

    }else {

    System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息!");

    System.out.println("请输入歌曲的名称:");

        String name=sc.next();

        System.out.println("请输入演唱者:");

        String singer=sc.next();

        Song song=new Song(id,name,singer);

        if(((PlayList)(plc.getPlayListMap().get(name)))==null) {

        PlayList playlist=(PlayList)(plc.getPlayListMap().get(name));

        playlist=new PlayList();

        }

        ((PlayList)(plc.getPlayListMap().get(name))).addToPlayList(song);        

    }

    }

    System.out.println("添加成功!");

      }else {

      System.out.println("该播放列表不存在,请先输入“9”返回上一级菜单,将播放列表添加到播放器中!");

      }      

  break;

case 3://通过歌曲id查询播放列表中的歌曲

  System.out.println("通过歌曲id查询播放列表中的歌曲");

      System.out.println("请输入要查询的播放列表名称:");

      String listname1=sc.next();

      System.out.println("请输入要查询的歌曲id:");

      String id=sc.next();

      Song song1=((PlayList)(plc.getPlayListMap().get(listname1))).searchSongById(id);

      if(song1==null) {

      System.out.println("该歌曲在播放列表"+listname1+"中不存在!");

      }else {

      System.out.println("该歌曲的信息为:");

      System.out.println(song1);

      }break;

case 4://通过歌曲名称查询播放列表中的歌曲

  System.out.println("通过歌曲名称查询播放列表中的歌曲");

      System.out.println("请输入要查询的播放列表名称:");

      String listname2=sc.next();

      pl.setPlayListName(listname2);

      System.out.println("请输入要查询的歌曲名称:");

      String songname=sc.next();

          Song song2=pl.searchSongByName(songname);

      if(song2==null) {

      System.out.println("该歌曲在播放列表"+listname2+"中不存在!");

      }else {

      System.out.println("该歌曲的信息为:");

      System.out.println(song2);

      }break;

case 5://修改播放列表中的歌曲

  System.out.println("修改播放列表中的歌曲");

      System.out.println("请输入要修改的歌曲id:");

      String newid=sc.next();

      pl.updateSong(pl.searchSongById(newid));

      System.out.println("修改成功!");

      break;

case 6://删除播放列表中的歌曲

  System.out.println("删除播放列表中的歌曲");

          System.out.println("请输入要删除的歌曲id:");

          String oldid=sc.next();

          pl.deleteSong(oldid);

          System.out.println("删除成功!");

          break;

case 7://显示播放列表中的所有歌曲

  System.out.println("显示播放列表中的所有歌曲");

          System.out.println("请输入要显示的播放列表名称:");

          String listname3=sc.next();

//           setMusicList(plc.getPlayListMap().get(listname3));

          ((PlayList)(plc.getPlayListMap().get(listname3))).displayAllSong();

//           new PlayList().setPlayListName(listname3);

//           new PlayList().displayAllSong();

          break;

case 8://导出歌单

  System.out.println("导出歌单");

      pl.exportPlayList();

      System.out.println("歌单导出成功!");

      break;

case 9://返回上一级菜单

  flag=true;

      break;

default:System.out.println("该数字没有对应的操作!");break;

}

if(flag)break;

}

        break;

       case 2:

n=0;

boolean flagg=false;

//try{

while(true) {


playerMenu();

n=sc.nextInt();

switch(n) {

case 1://向播放器添加播放列表

  System.out.println("向播放器添加播放列表");

      System.out.println("输入要添加的播放列表名称:");   

      String listname=sc.next();       

      boolean flag1=false;//判断要添加的播放列表是否存在,false为不存在       

      Iterator<Entry<String,PlayList>> it=plc.getPlayListMap().values().iterator();

  while(it.hasNext()) {

if(listname.equals(((PlayList) it.next()).getPlayListName())) {

  flag1=true;//找到相同名字的播放列表

  break;

}

  }

       

  if(flag1) {

  System.out.println("该播放器列表已存在!");

  }else {

  PlayList pl1=new PlayList(listname,null);   

  plc.addPlayList(pl1);

  pl1=pl;

  System.out.println("添加成功!");

  }

      break;

case 2://从播放器删除播放列表

System.out.println("从播放器删除播放列表");

      System.out.println("输入要删除的播放列表名称:");   

      String listname1=sc.next();       

      boolean flag2=false;//判断要删除的播放列表是否存在,false为不存在

  Iterator<Entry<String,PlayList>> it1=plc.getPlayListMap().values().iterator();

  while(it1.hasNext()) {

  if(listname1.equals(((PlayList) it1.next()).getPlayListName())) {

  flag2=true;//找到相同名字的播放列表

  break;

  }

    }

  if(flag2) {

  plc.deletePlayList((PlayList)plc.getPlayListMap().get(listname1)); 

  System.out.println("删除成功!");

  }else {

  System.out.println("该播放器列表不存在!");

  }

  break;

case 3://通过名字查询播放列表信息

  System.out.println("通过名字查询播放列表信息");

  System.out.println("请输入要查询的播放列表名称:");

  String listname2=sc.next();

  if(plc.searchPlayListByName(listname2)!=null) {

  System.out.println("该播放列表存在!");   

  System.out.println(plc.searchPlayListByName(listname2).toString());   

  }else {

  System.out.println("该播放列表不存在!");

  }

  break;

case 4://显示所有播放列表名称

  System.out.println("显示所有播放列表名称");

  plc.displayPlayListName();

      break;

case 9://返回上一级菜单

  flagg=true;

  break;

}

if(flagg)break;

}

        break;

       case 0:System.exit(0);

       default:System.out.println("该数字没有对应的操作!");       

       }

}}}







正在回答

登陆购买课程后可参与讨论,去登陆

6回答

 ((PlayList)(plc.getPlayListMap().get(name))).addToPlayList(song);     

这是向普通播放列表添加歌曲,这句话写错了get后面的应该是listname,也就是播放列表名称,而name在这里是歌曲名称,所以导致播放列表为null

另外,你的PlayList类中,声明musicList中最好进行创建对象,不然很容易出现空指针异常。

还有下面这段代码,如果你的musicList传进来的参数为null,而该构造方法又没有创建ArrayList对象,除非你一直使用getMusicList()方法去获取List,否则也容易发生空指针异常。

public PlayList(String playListName,List musicList) { this.setMusicList(musicList); this.setPlayListName(playListName); }

如果还有问题,可以继续提问。祝学习愉快!

  • mly魉 提问者 #1
    非常感谢!问题已经解决了
    2017-12-10 10:48:27
提问者 mly魉 2017-11-27 12:35:36

播放器类:

package com.imooc.player;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

import java.util.Set;


/**

 * 播放器类

 * @author TaiMeng

 *

 */

public class PlayListCollection {

private Map playListMap;//key--列表名   value--播放列表


//getter和setter方法

public Map getPlayListMap() {

if(playListMap==null) {

playListMap=new HashMap();

}

return playListMap;

}


public void setPlayListMap(Map playListMap) {

this.playListMap = playListMap;

}


//构造方法

public PlayListCollection() {

}

public PlayListCollection(Map playListMap) {

if(playListMap==null) {

playListMap=new HashMap<String,PlayList>();

}

this.setPlayListMap(playListMap);

}



//添加播放列表(普通播放列表)

public void addPlayList(PlayList playlist) {

if(playlist==null) {

playlist=new PlayList();

}

playListMap.put(playlist.getPlayListName(), playlist);

}

//删除播放列表

public void deletePlayList(PlayList playlist) {

playListMap.remove(playlist.getPlayListName());

}

//通过名字查询

public PlayList searchPlayListByName(String playListName) {

if(playListMap.containsKey(playListName)) {

return (PlayList)playListMap.get(playListName);

}else {

return null;

}

}

//显示所有播放列表名称

public void displayPlayListName() {

System.out.println("播放列表名称为:");

Set<String> keyset=playListMap.keySet();

for(String ks:keyset) {

System.out.println(ks);

}


}

}


提问者 mly魉 2017-11-27 12:34:29

Song类:

package com.imooc.player;

/**

 * 歌曲类

 * @author TaiMeng

 *

 */

public class Song {

private String id;

private String name;

private String singer;


//getter和setter方法

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSinger() {

return singer;

}

public void setSinger(String singer) {

this.singer = singer;

}


//构造方法

public Song() {

}

public Song(String id,String name,String singer) {

this.setId(id);

this.setName(name);

this.setSinger(singer);

}


//toString方法

public String toString() {

return "歌曲信息  :id为"+this.getId()+",歌曲名称为"+this.getName()+",演唱者为"+this.getSinger();

}


//hashCode()和equals()方法

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((id == null) ? 0 : id.hashCode());

result = prime * result + ((name == null) ? 0 : name.hashCode());

result = prime * result + ((singer == null) ? 0 : singer.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if(this==obj) {

return true;

}

if(this.getClass()==Song.class) {

Song song=(Song)obj;

return song.getId().equals(id)&&song.getName().equals(name)&&song.getSinger().equals(singer);

}

return false;

}


}


喜欢做梦的鱼 2017-11-25 19:17:57

你可以在问题和回答里分别贴代码,多贴几个回答就行,还可以在代码里面选择语言进行格式化,不要贴图

  • 提问者 mly魉 #1
    好的,谢谢
    2017-11-27 12:26:37
  • 提问者 mly魉 #2
    一共四个类,都贴上了,希望老师能帮忙看看怎么解决这个空指针异常的问题
    2017-11-27 12:37:43
一叶知秋519 2017-11-24 10:11:28

需要在构造方法内对musicList进行初始化,即:

public PlayList(String playListName) {

this.playListName = playListName;

musicList = new ArrayList<Song>();

}

祝学习愉快~

  • 提问者 mly魉 #1
    在构造方法内初始化后还有空指针异常,是怎么回事呢?还有就是提问时本来想粘更多的代码方便老师帮助修改错误,但是有字符限制,代码能截图吗
    2017-11-25 10:00:43
好帮手慕珊 2017-11-23 13:46:42

需要检查一下你的PlayList类,里面应该有个ArrayList用于存储数据,看一下是否有创建对象的语句new ArrayList();如果还是有问题,请把代码贴全了。祝学习愉快!

  • 提问者 mly魉 #1
    这是PlayList类 Public class PlayList { private String playListName; private List musicList; //getter和setter方法 public String getPlayListName() { if(playListName==null) { playListName=new String(); } return playListName; } public void setPlayListName(String playListName) { this.playListName = playListName; } public List getMusicList() { if(musicList==null) { musicList=new ArrayList(); } return musicList; } public void setMusicList(List musicList) { this.musicList = musicList; } //构造方法 public PlayList() { } public PlayList(String playListName,List musicList) { this.setMusicList(musicList); this.setPlayListName(playListName); }
    2017-11-24 08:36:19
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师