歌曲的输出和导出歌单出现空指针异常。

歌曲的输出和导出歌单出现空指针异常。

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 ;
 }
 
 
 
 
 
}


正在回答

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

2回答

同学是说这样时没有输出吗?

http://img1.sycdn.imooc.com//climg/5c99e77a000152b105900565.jpg

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

http://img1.sycdn.imooc.com//climg/5c99e7b3000139c304980559.jpg

http://img1.sycdn.imooc.com//climg/5c99e7bf00010e9a05310455.jpg

同学是表达的这个意思吗?

这个是因为同学在case 2中写了遍历的语句呀:

http://img1.sycdn.imooc.com//climg/5c99e7f90001590208230464.jpg

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

http://img1.sycdn.imooc.com//climg/5c99e8210001db4207600505.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕阿莹 2019-03-26 10:24:20

1、空指针异常代码有对象值为null时 去调用方法了,:

例如一开始选择7--显示播放列表中的所有歌曲  

则会显示空指针异常

play.getPlayListMap().get(name).getMusicList().isEmpty()  

当play.getPlayListMap().get(name) 时,找到的就是null了(主播放列表这个key对应的value就是null),再往后调用时,就会报空指针异常了。

http://img1.sycdn.imooc.com//climg/5c998ab000013c7a06870278.jpg

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

http://img1.sycdn.imooc.com//climg/5c9989240001deb812790241.jpg

2、如果我们展示的不是主播放列表,展示的是其他未添加的播放列表,应提示还没有这个播放列表

既:注释中的代码可以用来测试,到了那个对象为null,为什么会是null,然后去想如果避免

http://img1.sycdn.imooc.com//climg/5c998cde000103b610890320.jpg

其他的时候,出现空指针异常,同学都可以这样去考虑判断一下。

导出播放列表同理。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 Levinson #1
    老师,我改了之后发现我输入歌曲到主播放列表可是最后确没有输出了。这是什么原因,如果加入普通列表确是可以输入出来。
    2019-03-26 12:34:56
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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