将歌曲添加到普通播放列表中为什么会出现空指针异常
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("该数字没有对应的操作!");
}
}}}
正在回答
((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); }
如果还有问题,可以继续提问。祝学习愉快!
播放器类:
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);
}
}
}
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;
}
}
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星