【问题标题】:How do I use do/while with a case statement?如何在 case 语句中使用 do/while?
【发布时间】:2021-03-28 08:08:44
【问题描述】:

我想生成一个唯一的术语,它是一个字母后跟两个数字,然后我想检查它是否不在数据库中。我尝试使用 do,然后使用一段时间,但我无法让它工作。我收到java: illegal start of expression 错误。你能看到我做错了什么吗?或者,有没有更好的方法来做到这一点?

这是我的代码:

    public String setNumber(ReportType type) {

        Random rand = new Random();


  
        String number = String.format("%02d", rand.nextInt(100));

     
        String prefix = "";

        do {
            switch (type) {
                case CHILD:
                    prefix = "A";
                    break;
                case ELDER:
                    prefix = "B";
                    break;
                case BOOMER:
                    prefix = "C";
                    break;
                
            }
            String fullNumber = prefix + number;
            while (dataBase.findInDataBase(fullNumber)) throws FileNotFoundException);

        }


        return fullNumber;
    }

【问题讨论】:

  • 我认为除了IntegerString 之外,您不能将objectsswitch 一起使用
  • 另外,您的 do 未与您的 while 配对。而while (dataBase.findInDataBase(fullNumber)) throws FileNotFoundException) 没有意义。并且括号不匹配。
  • 最多有。您可以选择 100 个潜在数字。列出所有这些数字(如果是 CHILD,则为 A00 到 A99),从数据库中获取所有数字并将它们从列表中删除,然后随机选择列表中剩余的数字之一。我认为这样会更快,因为您只需要询问数据库一次。
  • 一样吗? stackoverflow.com/q/66804027/15244370 至少代码相似,缩进/结构错误相同 - '{}' 很重要
  • @neha 你忘了enum 和所有整数类型:"选择器表达式的类型必须是 char, byte, short, int, Character, Byte, Short, Integer, String,或枚举类型”

标签: java switch-statement do-while


【解决方案1】:

您的代码中有两个语法错误:

  1. do 之后开始的大括号必须在while 之前结束,而不是在它之后。
  2. throws FileNotFoundException 不属于它所在的位置。您可能从 findInDataBase 方法的声明或其他地方复制了它。直接删除即可。

编辑:

findInDataBase 抛出 FileNotFoundException 异常时 在数据库中找不到项目。它不返回布尔值。什么时候 什么也没找到,我想返回确认的唯一术语。我如何能 完成while语句?

使用try-catch 构造来查看是否抛出异常。还有一个boolean 变量来控制循环。

public String setNumber(ReportType type) {

    Random rand = new Random();

    String number = String.format("%02d", rand.nextInt(100));

    String prefix = "";

    String fullNumber;
    boolean found;
    do {
        switch (type) {
            case CHILD:
                prefix = "A";
                break;
            case ELDER:
                prefix = "B";
                break;
            case BOOMER:
                prefix = "C";
                break;
        }
        fullNumber = prefix + number;
        try {
            dataBase.findInDataBase(fullNumber);
            found = true;
        } catch (FileNotFoundException fnfe) {
            found = false;
        }
    } while (found);

    return fullNumber;
}

替代方案:以下内容可能会引发激烈的讨论,因为有些人认为这是不好的风格。它简化了一些事情,因为它使我们不必在循环之前声明两个未初始化的变量。

public String setNumber(ReportType type) {

    Random rand = new Random();

    String number = String.format("%02d", rand.nextInt(100));

    String prefix = "";

    // This loop will be terminated by a return statement inside of it.
    while (true) {
        switch (type) {
            case CHILD:
                prefix = "A";
                break;
            case ELDER:
                prefix = "B";
                break;
            case BOOMER:
                prefix = "C";
                break;
        }
        String fullNumber = prefix + number;
        try {
            dataBase.findInDataBase(fullNumber);
        } catch (FileNotFoundException fnfe) {
            // Nothing is found; return the confirmed unique term:
            return fullNumber;
        }
    }
}

你还没有解决问题。你需要在每次循环中从rand中抽取一个新的随机数。否则,如果抽取的第一个数字已经在数据库中,则您处于无限循环中。如果从 00 到 99 的所有 100 个号码都在使用,那么无论如何你都会使用。

注意:自 Java SE 14* 起,您可以使用 switch 表达式代替 switch 语句。

do {
    prefix = switch (type) {
    case CHILD -> "A";
    case ELDER -> "B";
    case BOOMER -> "C";
    };
    fullNumber = prefix + number;
} while (dataBase.findInDataBase(fullNumber));

* switch 表达式是在 Java SE 12 中引入的。但是,它仍然作为 Java SE 12 和 13 中的预览功能,并最终在 Java SE 14 中标准化。您可以查看this Q/A 以了解更多信息它。

【讨论】:

  • 谢谢,findInDataBase 抛出和fileNotFoundException 异常,当在数据库中找不到项目时。不是布尔值。当没有找到任何东西时,我想返回确认的唯一术语。如何完成while 声明?
猜你喜欢
  • 2015-09-14
  • 2020-05-07
  • 2012-02-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多