We help IT Professionals succeed at work.

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

Comment
Watch Question

nociSoftware Engineer
CERTIFIED EXPERT
Distinguished Expert 2019

Commented:
you probably need to remove the song AFTER moving to the next.
CERTIFIED EXPERT

Commented:
listiterator starts at index (0)

you cannot remove an item that is not there yet

call currentSong.next()  first, then call currentSong.remove();
CERTIFIED EXPERT
Commented:
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());
                    }

Open in new window


Here your checking next song and currentSong.previous() method . one fault

   currentSong.next();  
        listIterator.remove();

Open in new window


currentSong.next() before remove method . if you want to remove the 1st item in the list you need to travel that place
CERTIFIED EXPERT

Commented:
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.
CERTIFIED EXPERT

Commented:
I posted code to this question - anyone know what happened to it?