歌曲的输出和导出歌单出现空指针异常。
package com.imooc.play;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class TestDemo {
PlayList playlist = new PlayList();// 主播放列表集合
PlayList norplaylist = new PlayList();// 普通播放列表
PlayListCollection play = new PlayListCollection();// 存放播放列表集合
// Map<String,Song> norplayList = new HashMap<String, Song>();//普遍播放列表
// 主菜单
public void mainMenu() {
System.out.println("**************************************");
System.out.println(" **主菜单** ");
System.out.println(" 1--播放列表管理 ");
System.out.println(" 2--播放器管理 ");
System.out.println(" 0--退出 ");
System.out.println("**************************************");
}
// 播放列表管理菜单
public void playListMenu() {
System.out.println("*************************************************");
System.out.println(" **播放列表管理** ");
System.out.println(" 1--将歌曲添加到主播放列表 ");
System.out.println(" 2--将歌曲添加到普通播放列表 ");
System.out.println(" 3--通过歌曲id查询播放列表中的歌曲 ");
System.out.println(" 4--通过歌曲名称查询播放列表中的歌曲 ");
System.out.println(" 5--修改播放列表中的歌曲 ");
System.out.println(" 6--删除播放列表中的歌曲 ");
System.out.println(" 7--显示播放列表中的所有歌曲 ");
System.out.println(" 8--导出歌单 ");
System.out.println(" 9--返回上一级菜单 ");
System.out.println("*************************************************");
}
// 播放器管理菜单
public void playerMenu() {
System.out.println("**********************************************");
System.out.println(" **播放器管理** ");
System.out.println(" 1--向播放器添加播放列表 ");
System.out.println(" 2--从播放器删除播放列表 ");
System.out.println(" 3--通过名字查询播放列表信息 ");
System.out.println(" 4--显示所有播放列表名称 ");
System.out.println(" 9--返回上一级菜单 ");
System.out.println("**********************************************");
}
// 播放列表演示
public void playListDemo() {
labelA: while (true) {
playListMenu();
System.out.println("请输入对应的数字对播放列表进行管理:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
switch (n) {
case 1:
System.out.println("将歌曲添加到主播放列表");
System.out.println("请输入要添加的歌曲的数量:");
int num;// 要添加的歌曲数量
num = s.nextInt();
for (int i = 0; i < num; i++) {
Song song = new Song();
System.out.println("请输入第" + (i + 1) + "首歌曲:");
System.out.println("请输入歌曲的id:");
String id = s.next();
song.setId(id);
System.out.println("请输入歌曲的名称:");
String name = s.next();
song.setName(name);
System.out.println("请输入演唱者:");
String singer = s.next();
song.setSinger(singer);
playlist.addToPlayList(song);// 将歌曲信息添加到主播放列表中
}
break;
case 2:
System.out.println("将歌曲添加到普通播放列表");
System.out.println("请输入要添加的播放列表名称:");
Scanner s1 = new Scanner(System.in);
String name = s1.next();
if (play.getPlayListMap().keySet().contains(name)) {
System.out.println("请输入要添加的歌曲数量:");
int num1 = s1.nextInt();
for (int i = 0; i < num1; i++) {
Song song1 = new Song();
System.out.println("请输入第" + (i + 1) + "歌曲:");
System.out.println("请输入歌曲id:");
String id = s1.next();
if (playlist.searchSongById(id) != null) {
norplaylist.addToPlayList(playlist.searchSongById(id));
} else {
System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息!");
song1.setId(id);
System.out.println("请输入歌曲名称:");
String name1 = s1.next();
song1.setName(name1);
System.out.println("请输入演唱者:");
String singer1 = s1.next();
song1.setSinger(singer1);
norplaylist.addToPlayList(song1);// 将歌曲添加到普通播放列表
playlist.addToPlayList(song1);// 将新歌曲添加到主播放列表
}
}
} else {
System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
}
System.out.println("主播放列表:");
System.out.println("播放列表中的所有歌曲为:");
for (int i = 0; i < playlist.getMusicList().size(); i++) {
System.out.println(playlist.getMusicList().get(i));
}
System.out.println("普通播放列表:");
System.out.println("播放列表中的所有歌曲为:");
for (int i = 0; i < norplaylist.getMusicList().size(); i++) {
System.out.println(norplaylist.getMusicList().get(i));
}
break;
case 3:
Scanner s3 = new Scanner(System.in);
System.out.println("请输入要查询的播放列表名称:");
name = s3.next();
if (play.getPlayListMap().keySet().contains(name)) {
System.out.println("请输入要查询的歌曲id:");
String id = s3.next();
for (int i = 0; i < play.getPlayListMap().get(name).getMusicList().size(); i++) {
// if(play.getPlayListMap().get(name).getMusicList().equals(id)) {
System.out.println("该歌曲的信息为:\n" + play.getPlayListMap().get(name).searchSongById(id));// 通过输入歌曲id来获取歌曲信息
break;
// }
}
} else {
System.out.println(name + "播放列表不存在!");
}
break;
case 4:
Scanner s4 = new Scanner(System.in);
System.out.println("请输入要查询的播放列表名称:");
name = s4.next();
if (play.getPlayListMap().keySet().contains(name)) {
System.out.println("请输入要查询的歌曲名称:");
String name1 = s4.next();
for (int i = 0; i < play.getPlayListMap().get(name).getMusicList().size(); i++) {
// if(play.getPlayListMap().get(name).getMusicList().equals(name1)) {
System.out.println("该歌曲的信息为:\n" + play.getPlayListMap().get(name).searchSongByName(name1));// 通过输入歌曲名称来获得歌曲信息
break;
// }
}
} else {
System.out.println(name + "播放列表不存在");
}
break;
case 5:
Scanner s5 = new Scanner(System.in);
System.out.println("修改播放列表中的歌曲");
System.out.println("请输入要修改的歌曲id:");
String id = s5.next();
for (int i = 0; i < playlist.getMusicList().size(); i++) {
if (playlist.getMusicList().contains(playlist.getMusicList().get(i))) {
playlist.updataSong(id, (Song) playlist.getMusicList().get(i));//修改主播放列表中的歌曲
break;
}
}
//判断歌曲编号是否在普通列表当中
if(playlist.searchSongById(id).getId().equals(norplaylist.searchSongById(id).getId())) {
norplaylist.searchSongById(id).setName(playlist.searchSongById(id).getName());//将普通列表的名称进行修改
norplaylist.searchSongById(id).setSinger(playlist.searchSongById(id).getSinger());//将普通列表的演唱者进行修改
}
break;
case 6:
System.out.println("请输入要删除的歌曲id:");
Scanner s6 = new Scanner(System.in);
id = s6.next();
playlist.deleteSong(id);
if(id.equals(norplaylist.searchSongById(id).getId())) {
norplaylist.deleteSong(id);
}
break;
case 7:
System.out.println("显示播放列表中的所有歌曲");
System.out.println("请输入要显示的播放列表名称:");
Scanner s7 = new Scanner(System.in);
name = s7.next();
System.out.println("播放列表中的所有歌曲为:");
if(play.getPlayListMap().get(name).getMusicList().isEmpty()) {
System.out.println("该播放列表还没有歌曲!");
}
else {
play.getPlayListMap().get(name).displayAllSong();
}
break;
case 8:
System.out.println("请输入要导出的播放列表");
Scanner s8 = new Scanner(System.in);
name = s8.next();
if(play.getPlayListMap().get(name).getMusicList().isEmpty()) {
play.getPlayListMap().get(name).exportPlayList();
}
else {
System.out.println("没有次播放列表");
}
break;
case 9:
break labelA;
default:
System.out.println("输入有误,请重新输入!");
}
}
}
// 播放器演示
public void playerDemo() {
labelA: while (true) {
playerMenu();
try {
System.out.println("请输入对应的数字对播放器进行管理:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
switch (n) {
case 1:
// System.out.println("向播放器添加播放列表");
// System.out.println("输入要添加的播放列表名称:");
// String name = s.next();
// norplaylist.setPlayListName(name);
play.addPlayList(norplaylist);
break;
case 2:
play.deletePlayList(norplaylist);
break;
case 3:
System.out.println("通过名字查询列表信息");
System.out.println("请输入要查询的播放列表名称:");
String str = s.next();
play.searchPlayListByName(str);
break;
case 4:
System.out.println("显示所有播放列表名称");
System.out.println("播放列表的名称为:");
play.displayPlayListName();
break;
case 9:
break labelA;
default:
System.out.println("输入有误请重新输入!");
}
} catch (Exception e) {
System.out.println("输入的不是整数,请重新输入!");
}
}
}
public static void main(String[] args) {
// 创建主方法类的对象
TestDemo td = new TestDemo();
// 主循环
labelA: while (true) {
td.mainMenu();// 调用主菜单
System.out.println("请输入对应数字进行操作:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();// 键盘输入
switch (n) {
case 1:
td.playListDemo();
break;
case 2:
td.playerDemo();// 调用播放器管理
break;
case 0:
break labelA;// 退出菜单
}
}
}
}package com.imooc.play;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
//播放器类
public class PlayListCollection {
Map<String,PlayList> playListMap = new HashMap<String,PlayList>(){{
put("主播放列表",new PlayList("主播放列表",null));
}};//存放播放列表集合,并初始化主播放列表
//构造方法
public PlayListCollection() {
}
public PlayListCollection(Map<String, PlayList> playListMap) {
super();
this.playListMap = playListMap;
}
//getter和setter方法
public Map<String, PlayList> getPlayListMap() {
return playListMap;
}
public void setPlayListMap(Map<String, PlayList> playListMap) {
this.playListMap = playListMap;
}
//添加播放列表
public void addPlayList(PlayList playList) {
System.out.println("向播放器添加播放列表");
System.out.println("输入要添加的播放列表名称:");
Scanner s = new Scanner(System.in);
String name = s.next();
if(playListMap.containsKey(name)) {
System.out.println("该播放列表已经存在");
}
else {
playListMap.put(name, playList);
}
}
//删除播放列表
public void deletePlayList(PlayList playList) {
System.out.println("从播放器删除播放列表");
System.out.println("输入要删除的播放列表名称:");
Scanner s = new Scanner(System.in);
String name = s.next();
if(playListMap.containsKey(name)) {
playListMap.remove(name);
}
else {
System.out.println("该列表不存在!");
}
}
//通过名字查询
public PlayList searchPlayListByName(String playListName) {
if(playListMap.containsKey(playListName)) {
System.out.println("该播放列表存在!");
return playListMap.get(playListName);
}
else {
System.out.println("该列表不存在!");
return null;
}
}
//显示所有播放列表名称
public void displayPlayListName() {
Set<String> KeySet = playListMap.keySet();
for(String s:KeySet) {
System.out.println(s);
}
}
}package com.imooc.play;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//播放列表类
public class PlayList {
private String playListName;//播放列表名称
private List<Song> musicList=new ArrayList<Song>();//播放列表中的歌曲集合
public PlayList() {
}
//构造方法
public PlayList(String playListName, List<Song> musicList) {
this.playListName = playListName;
this.musicList = musicList;
}
//getter和setter方法
public String getPlayListName() {
return playListName;
}
public void setPlayListName(String playListName) {
this.playListName = playListName;
}
public List getMusicList() {
return musicList;
}
public void setMusicList(List<Song> musicList) {
this.musicList = musicList;
}
//toString方法重写
@Override
public String toString() {
return "该播放列表的名称为:"+playListName+"\n播放列表中的所有歌曲为:"+musicList;
}
//将歌曲添加到播放列表
public void addToPlayList(Song song) {
musicList.add(song);
}
//显示播放列表中所有歌曲
public void displayAllSong() {
for(Song song:musicList) {
System.out.println(song);
}
}
//通过id查询歌曲
public Song searchSongById(String id) {
for(int i=0;i<musicList.size();i++) {
if(id.equals(musicList.get(i).getId())){
return musicList.get(i);
}
}
System.out.println("该歌曲在"+playListName+"中不存在!");
return null;
}
//通过名称查询歌曲
public Song searchSongByName(String n) {
for(int i=0;i<musicList.size();i++) {
if(n.equals(musicList.get(i).getName())) {
return musicList.get(i);
}
}
System.out.println("该歌曲在"+playListName+"中不存在!");
return null;
}
//修改歌曲
public void updataSong(String id,Song song) {
Scanner s = new Scanner(System.in);
System.out.println("请输入修改后的歌曲名称:");
String name = s.next();
song.setName(name);
System.out.println("请输入修改后的演唱者:");
String singer = s.next();
song.setSinger(singer);
System.out.println("修改成功");
}
//从播放列表删除歌曲
public void deleteSong(String id) {
for(int i=0;i<musicList.size();i++) {
if(id.equals(musicList.get(i).getId())) {
musicList.remove(i);
}
}
}
//导出歌单
public void exportPlayList() {
try {
FileOutputStream fos = new FileOutputStream(this.getPlayListName()+"的歌单.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(musicList);
oos.writeObject(null);
oos.flush();
oos.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}package com.imooc.play;
//歌曲类
public class Song {
private String id;//歌曲id
private String name;//歌曲名
private String singer;//演唱者
//构造方法
public Song() {
}
public Song(String id, String name, String singer) {
this.id = id;
this.name = name;
this.singer = 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;
}
//hashCode和equlas方法
@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 (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Song other = (Song) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (singer == null) {
if (other.singer != null)
return false;
} else if (!singer.equals(other.singer))
return false;
return true;
}
//toString方法
@Override
public String toString() {
return "歌曲信息:id为" + id + ", 歌曲名称为:" + name + ", 演唱者为:" + singer ;
}
}0
收起
正在回答
2回答
同学是说这样时没有输出吗?

选择2,讲歌曲添加到普通播放列表时,就会展示:


同学是表达的这个意思吗?
这个是因为同学在case 2中写了遍历的语句呀:

而case 1中并没有写遍历循环输出:

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
好帮手慕阿莹
2019-03-26 10:24:20
1、空指针异常代码有对象值为null时 去调用方法了,:
例如一开始选择7--显示播放列表中的所有歌曲
则会显示空指针异常
play.getPlayListMap().get(name).getMusicList().isEmpty()
当play.getPlayListMap().get(name) 时,找到的就是null了(主播放列表这个key对应的value就是null),再往后调用时,就会报空指针异常了。

同学看一下,首先,同学在添加主播放列表的时候,不能写成null:

2、如果我们展示的不是主播放列表,展示的是其他未添加的播放列表,应提示还没有这个播放列表
既:注释中的代码可以用来测试,到了那个对象为null,为什么会是null,然后去想如果避免

其他的时候,出现空指针异常,同学都可以这样去考虑判断一下。
导出播放列表同理。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星