歌曲的输出和导出歌单出现空指针异常。
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 星