Java Java Data Structures Efficiency! Custom Serialization

annient
PRO
annient
Pro Student 1,708 Points

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsExcept

I tried to see if method importTo() in SongBook file work if I have songs.txt. This is what I got:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsExcept
ion: 1
at com.teamtreehouse.model.SongBook.importFrom(SongBook.
java:43)
at Karaoke.main(Karaoke.java:17)

Please help :(

annient
annient
Pro Student 1,708 Points

Here is my Karaoke.java file:

import com.teamtreehouse.KaraokeMachine;
import com.teamtreehouse.model.Song;
import com.teamtreehouse.model.SongBook;

public class Karaoke {

  public static void main(String[] args) {
    SongBook songBook = new SongBook();
    songBook.importFrom("songs.txt");
    KaraokeMachine machine = new KaraokeMachine(songBook);
    machine.run();
    System.out.println("Saving book....");
    songBook.exportTo("songs.txt");
  }
}

And my SongBook.java file:

package com.teamtreehouse.model;

import java.io.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;

public class SongBook {
  private List<Song> mSongs; 

  public SongBook() { //constructor
   mSongs = new ArrayList<Song>(); 
  }

  public void exportTo(String fileName) { 
    try (
      FileOutputStream fos = new FileOutputStream(fileName);       
      PrintWriter writer = new PrintWriter(fos);
    ) {
      for (Song song: mSongs) {
        writer.printf("%s|%s|%s%n", 
                      song.getArtist(), 
                      song.getTitle(), 
                      song.getVideoUrl());
      }
    } catch (IOException ioe) {
      System.out.printf("Problem saving %s %n", fileName);
      ioe.printStackTrace();
    }
  }

  public void importFrom(String fileName) { 
    try (
      FileInputStream fis = new FileInputStream(fileName);
      BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
    ) { 
      String line;
      while((line = reader.readLine()) != null) {
        String[] args = line.split("\\|");
        addSong(new Song(args[0], args[1], args[2])); 
      }
    } catch (IOException ioe) {
      System.out.printf("Problem loading %s %n", fileName);
    }
  }

  public void addSong(Song song) { 
    mSongs.add(song);
  }

  public int getSongCount() { 
    return mSongs.size();
  }

  //FIXME: this should be cached
  private Map<String, List<Song>> byArtist() { 
    Map<String, List<Song>> byArtist = new HashMap<>();
    for (Song song: mSongs) {
      List<Song> artistSongs = byArtist.get(song.getArtist()); 
      if (artistSongs == null) { //if the song has not been defined
        artistSongs = new ArrayList<>();
        byArtist.put(song.getArtist(), artistSongs);
      }
      artistSongs.add(song); 
    }
    return byArtist;
  }

  public Set<String> getArtists() {
    return byArtist().keySet();  
  }

  public List<Song> getSongsForArtist(String artistName) {
    return byArtist().get(artistName);  
  }
}
Philip Gales
Philip Gales
15,192 Points

Take a snapshot of your workspace file by clicking on the camera in the upper right. Then you can share the link when you view the snapshot. I suspect it is your songs.txt file.

2 Answers

Rashadat Mirzayev
Rashadat Mirzayev
14,601 Points

Hi, annient. How did you fix the problem, cause I have the same? Can you share pls

Philip Gales
Philip Gales
15,192 Points

If you "fork snapshot" you will be able to use it without having to copy my code. Your snapshot is incomplete and has a lot of errors.

The problem was your songs.txt file. It had some blank lines that were causing the error.

https://w.trhou.se/bfmncf3gqm

annient
annient
Pro Student 1,708 Points

Thanks. I fixed song.txt file and it works. :)