try / catch работает для операторов + if + switch, break необходимо после оператора if, заключенного в цикл for, содержащий переключатель, почему? - PullRequest
0 голосов
/ 04 мая 2018

Я новичок в Java и не могу понять break;, что необходимо после if оператора в моем коде. Если я не добавлю последний оператор break; после закрытия switch, я получу несколько копий песен с одинаковым названием, но разной длительности.

Однако, если я добавлю break;, я получу только одну копию указанной песни в музыкальном файле пользователя. Я пытаюсь понять, почему это происходит. Это потому, что если я не откажусь от оператора if, который содержит switch, то коммутатор повторяет его сам?

try{
     Scanner input = new Scanner(inFile);
        //looping through user requested file of music
        while (input.hasNextLine()){

            //reads new line in the file
            String line = input.nextLine();
            String[] tokens = line.split("[,]");

            // loops through list of all songs
            for (int i = 0; i < allSongs.length; i++){

                String nameOfSong = tokens[1];

                if (allSongs[i].getTitle().equals(nameOfSong)){

                    String playlistTypeName = tokens[0];

                    switch (playlistTypeName){
                        case "playlist1":
                            playlist1.enqueue(allSongs[i]);
                            break;

                        case "playlist2":
                            playlist2.enqueue(allSongs[i]);
                            break;

                        case "playlist3":
                            playlist3.enqueue(allSongs[i]);
                            break;

                        default:
                            break;
                    }
                    break;
                }
            }
        }

1 Ответ

0 голосов
/ 04 мая 2018

У вас есть переключатель в цикле в цикле. Операторы break внутри корпуса переключателя "выпрыгивают" из переключателя .

Но этот код все еще находится в цикле (который находится в другом цикле).

Таким образом, внешний разрыв влияет на то, как происходит "зацикливание".

Итак, реальный ответ здесь - отступить назад и посмотреть на каждую из этих вещей в отдельности. И один хороший способ достичь этого - это , а не , объединяющий так много вещей в одном методе. Скорее используйте отдельный метод, который выполняет обработку переключения самостоятельно.

Другими словами: вы добавили слишком много сложности в свой код. И теперь вы потеряли след того, что происходит.

А если быть более точным: в вашем случае вы используете неправильное решение. Значение: то, что вы на самом деле хотите сделать, это отобразить строку (например, "playlist1" на конкретный объект. Поэтому вместо того, чтобы делать это вручную , используя инструкцию switch, вы может использовать

Map<String, PlayList> playListsByName = new HashMap<>();
playListsByName.put("playlist1", playlist1);
...

И тогда ваш оператор switch пропадает, и вместо этого вы делаете что-то вроде:

 PlayList plist = playListsByName.get(yourToken);
 if (plist != null) {
    plist.enqueue(allSongs[i]);
 } else {
   ... error handling: invalid play list token
...