Link to home
Start Free TrialLog in
Avatar of Software Software
Software SoftwareFlag for Austria

asked on

How to fix "IllegalStateException" in my code

Hello,
The program is about playing the next or previous song, replay or remove a song.
If I want to delete a song immediately after starting the program (case 5), I get an "IllegalStateException".
How do I fix the error?
If you see further errors or have improvements to the code, then you can also tell me.


import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Scanner;

public class Songs {

    public static void main(String[] args) {

        LinkedList<String> songs = new LinkedList<>();
        songs.add("Song 1");
        songs.add("Song 2");
        songs.add("Song 3");
        songs.add("Song 4");
        songs.add("Song 5");
        songs.add("Song 6");

        Scanner scanner = new Scanner(System.in);
        boolean quit=false;
        boolean forward=true;
        ListIterator currentSong = songs.listIterator();

        printMenu();
        while(quit==false){
            switch(scanner.nextInt()){
                case 1:
                    printMenu();
                    break;
                case 2:
                    if(!forward){
                        if(currentSong.hasNext()){
                            currentSong.next();
                        }
                        forward=true;
                    }
                    if(currentSong.hasNext()){
                        System.out.println("Now playing " + currentSong.next());
                    }
                    else{
                        System.out.println("Reached the end of the playlist");
                    }
                    break;
                case 3:
                    if(forward){
                        if(currentSong.hasPrevious()){
                            currentSong.previous();
                        }
                        forward=false;
                    }
                    if(currentSong.hasPrevious()){
                        System.out.println("Now playing " + currentSong.previous());
                    }
                    else{
                        System.out.println("We are at the start of the playlist");
                    }
                    break;
                case 4:
                    if(currentSong.hasPrevious()){
                        currentSong.previous();
                        System.out.println("Replaying " + currentSong.next());
                    }
                    else if(currentSong.hasNext()){
                        currentSong.next();
                        System.out.println("Replaying " + currentSong.previous());
                    }
                    break;
                case 5:
                    if(songs.size()>0){
                        currentSong.remove();
                        if(currentSong.hasNext()){
                            currentSong.next();
                        }
                        else if(currentSong.hasPrevious()){
                            currentSong.previous();
                        }
                    }
                    break;
                case 6:
                    for(String song: songs){
                        System.out.println(song);
                    }
                    break;
                case 7:
                    quit=true;
                    break;
                default:
                    printMenu();
                    break;
            }
        }
    }

    private static void printMenu(){
        System.out.println("1 - Print Menu\n" +
                           "2 - Go to the next song\n" +
                           "3 - Go to previous song\n" +
                           "4 - Replay current song\n" +
                           "5 - Remove current song\n" +
                           "6 - Print all songs\n" +
                           "7 - Quit\n" +
                           "============================");
    }
}

Open in new window

Avatar of noci
noci

you probably need to remove the song AFTER moving to the next.
listiterator starts at index (0)

you cannot remove an item that is not there yet

call currentSong.next()  first, then call currentSong.remove();
ASKER CERTIFIED SOLUTION
Avatar of Sathish David  Kumar N
Sathish David Kumar N
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Regarding menu choice 4 (replaying current song), of course there won't really be a current song " to replay" at the very start of the programme, so you might want to give that situation some more thought. Nor can it be entirely clear whether the "current" song" should refer to the one that was last played, or to the one that the user has navigated to by choosing a different one with the previous and next choices, 2 and 3.
I posted code to this question - anyone know what happened to it?