【问题标题】:Program still looping after break in Java [duplicate]Java中断后程序仍在循环[重复]
【发布时间】:2019-05-03 13:28:14
【问题描述】:

我一直在开发一个程序,该程序将接受用户输入元素周期表中元素的名称或符号,然后输出有关该元素的一些事实。在这里问了很多问题后,我已经明白程序正确存储所有数据,以我想要的方式输出它,并且可以接受名称或符号的输入。我现在遇到的问题是我插入循环的中断实际上并没有从循环中中断,我真的不知道为什么。即使收到正确的输入,程序也会继续请求输入。此外,如果用户输入的是符号而不是名称,程序将在最终正确输出之前反复告诉用户他们的输入无效(然后重新启动循环而不是按原样中断)。我是 Java 新手,所以如果有人可以帮助我解决这些问题并解释问题发生的原因以及他们如何相当简单地解决它,我将不胜感激。

import java.util.Scanner;
public class PeriodicTable {

    public enum Element {
        Hydrogen("H", "Nonmetal", "1.008"),
        Helium("He", "Noble Gas", "4.003"),
        Lithium("Li", "Alkali Metal", "6.941"),
        Beryllium("Be", "Alkaline Earth", "9.012"),
        Boron("B", "Semimetal", "10.811"),
        Carbon("C", "Nonmetal", "12.011"),
        //The rest of the periodic table is here, I just removed it for the sake of this post.

        private String symbol;
        private String group;
        private String weight;

        private Element(String symbol, String group, String weight) {
            this.symbol = symbol;
            this.group = group;
            this.weight = weight;
        }
    }

    static Element cName = null;
    public static void main(String[] args) {

        System.out.println("Enter the name or symbol of an element in the periodic table. ");
        do {
            Scanner reader = new Scanner(System.in);
            String input = reader.nextLine().trim();
            for (Element sy : Element.values()) {
                if (sy.symbol.equalsIgnoreCase(input)) {
                    System.out.println("Element: " + sy + " (" + sy.symbol + ")" + "\nGroup: " + sy.group + "\nAtomic Mass: " + sy.weight);
                    reader.close();
                    break;
                } else {
                    try {
                        cName = Element.valueOf(input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase());
                        System.out.println("Element: " + cName + " (" + cName.symbol + ")" + "\nGroup: " + cName.group + "\nAtomic Mass: " + cName.weight);
                        reader.close();
                        break;
                    } catch(IllegalArgumentException e) {
                        System.out.println("That name or symbol is not valid. Please try again. ");
                        continue;
                    }
                }
            }
        } while (true);
    }
}

【问题讨论】:

  • 您的代码中似乎有 2 个循环。它只会从内部破坏一个。

标签: java loops validation enums break


【解决方案1】:

问题在于break 位于for 循环内,因此它只会中断到for 循环。如果你想打破do-while 循环,你可以使用标签:

outer:
do {
      Scanner reader = new Scanner(System.in);
      String input = reader.nextLine().trim();
      for (Element sy : Element.values()) {
         if (sy.symbol.equalsIgnoreCase(input)) {
                System.out.println("Element: " + sy + " (" + sy.symbol + ")" + "\nGroup: " + sy.group + "\nAtomic Mass: " + sy.weight);
                reader.close();
                break outer;
          } else {
              try {
                    cName = Element.valueOf(input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase());
                    System.out.println("Element: " + cName + " (" + cName.symbol + ")" + "\nGroup: " + cName.group + "\nAtomic Mass: " + cName.weight);
                    reader.close();
                    break outer;
              } catch(IllegalArgumentException e) {
                    System.out.println("That name or symbol is not valid. Please try again. ");
                    continue;
              }
          }
     }
} while (true);

【讨论】:

  • 当然,我不敢相信我没有看到!谢谢!我仍然遇到程序告诉用户他们的输入无效的问题,当他们为枚举中的每个项目输入一个符号时,直到它到达用户输入与该符号匹配的那个。你知道如何让它告诉用户他们的输入只有在检查了枚举中的每个项目后才无效?
  • @Gameskiller01 我会将 print 语句移到 catch 块之外并移到 for-each 循环之后。如果某个元素匹配,您将跳出do-while,并且永远无法到达 println。
猜你喜欢
  • 2019-02-01
  • 2022-12-07
  • 2016-04-03
  • 1970-01-01
  • 2020-11-29
  • 2014-02-02
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多