【问题标题】:try/catch holds for + if + switch statements, break; needed after if statement enclosed in for loop that contains switch, why?try/catch 对 + if + switch 语句成立,break;在包含 switch 的 for 循环中包含 if 语句后需要,为什么?
【发布时间】:2018-10-14 14:49:37
【问题描述】:

我对 Java 有点陌生,我无法真正理解在我的代码中的 if 语句之后需要的 break;。如果我在switch 关闭后不添加最后一个break; 语句,我会得到多个具有相同标题但时间长度不同的歌曲副本。

但是,如果我添加break;,我只会在用户的音乐文件中获得一份指定歌曲的副本。我试图理解为什么会这样。是因为如果我不脱离持有switchif 语句,那么开关会自我重复吗?

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

【问题讨论】:

  • 表示条件allSongs[i].getTitle().equals(nameOfSong)匹配allSongs中的多个条目。打破循环确保您在找到第一个匹配项后停止添加。
  • 谢谢你,这很有道理:)
  • 太棒了,非常有帮助,非常感谢。我不知道地图,学到了一些新东西:)。

标签: java if-statement switch-statement break


【解决方案1】:

你有一个循环中的开关。 switch 主体中的break 语句“跳”出 switch 部分。

但是该代码仍然位于一个循环中(它位于另一个循环中)。

因此,外部中断会影响“循环”的发生方式。

因此,这里的真正答案是退后一步,单独查看这些内容。实现目标的一个好方法是将这么多东西放在一个方法中。而是使用一种独特的方法来自行处理“开关”。

换句话说:您在代码中投入了过多的复杂性。现在你忘记了发生了什么。

更准确地说:在您的情况下,您使用的是 错误 解决方案。含义:您真正想要做的是将一个字符串(如“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

【讨论】:

  • 知道了,谢谢,我确实需要打破该方法以使其更简单,我只是想弄清楚如何拉出该 switch 语句并使其工作而不破坏所有它因为它依赖于 allSong[i]
  • 如果可以的话,只是一个快速的跟进问题。如果我有 3 个播放列表,我会为每个播放列表分别做 Map 吗?我之所以问,是因为我有 3 个不同的播放列表队列,所以我想弄清楚是否必须为每个队列完成地图。
  • 我会在 for 循环下添加 Map 吗? (很抱歉有这么多问题只是想把我的想法包裹起来)
  • @Niki 您添加了它适合的最小范围。如果您在多个地方需要它,例如,您可以将它作为您班级的一个字段。但是,即使它只是该方法中的“局部”变量,您也可以将用于初始化该映射的代码放入它自己的方法中。尝试将您的问题分解成许多小块,理想情况下,每块一个方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多