Java 如何在case语句中使用do/while?

Java 如何在case语句中使用do/while?,java,switch-statement,do-while,Java,Switch Statement,Do While,我想生成一个唯一的术语,即一个字母后跟两个数字,然后我想检查它是否不在数据库中。我试着使用do,然后是一段时间,但我无法让它工作。我得到一个java:expression的非法开始错误。你能看出我做错了什么吗?或者,有没有更好的方法 这是我的密码: public String setNumber(ReportType type) { Random rand = new Random(); String number = String.forma

我想生成一个唯一的术语,即一个字母后跟两个数字,然后我想检查它是否不在数据库中。我试着使用do,然后是一段时间,但我无法让它工作。我得到一个
java: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;
    }


代码中有两个语法错误:

  • do
    之后开始的花括号必须在
    之前结束,而不是在它之后结束
  • 抛出FileNotFoundException
    不属于它所在的位置。您可能从
    findInDataBase
    方法的声明或其他地方复制了它。删除它就行了
  • 编辑:

    findInDataBase
    在 在数据库中找不到项。它不返回布尔值。什么时候 未找到任何内容,我想返回已确认的唯一术语。我该怎么办 完成while语句

    使用
    try
    -
    catch
    构造查看是否引发异常。和一个
    布尔
    变量来控制循环

    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;
            }
        }
    }
    
    备选方案:以下内容可能会引发激烈的讨论,因为有些人发现这是一种糟糕的风格。它简化了一些事情,因为它使我们不用在循环之前声明两个未初始化的变量

    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;
            }
        }
    }
    
    您还没有解决问题。您需要在每次循环中从
    随机数中提取一个新的随机数。否则,如果绘制的第一个数字已经在数据库中,则您处于无限循环中。如果00到99之间的所有100个数字都在使用中,您仍将使用

    注意:自JavaSE14*以来,您可以使用
    switch
    表达式代替
    switch
    语句

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


    *开关表达式是在JavaSE12中引入的。然而,它在JavaSE12和JavaSE13中仍然是一个预览特性,并最终在JavaSE14中实现了标准化。您可以查看以了解更多信息。

    我认为除了使用
    整数和
    字符串
    开关之外,您不能使用
    对象
    ,而且您的
    do
    期间没有与
    配对。而
    while(dataBase.findInDataBase(fullNumber))抛出FileNotFoundException)
    没有意义。括号不匹配。最多可以选择100个潜在数字。列出所有这些数字(如果是儿童,则为A00到A99),从数据库中获取所有数字并将其从列表中删除,然后从列表中随机选择剩余的数字之一。我认为这会更快,因为您只需要询问数据库一次。相同吗?至少代码是相似的,缩进/结构错误是相同的,
    '{}'
    是相同的important@neha您忘记了枚举和所有整数类型:“选择器表达式的类型必须是char、byte、short、int、Character、byte、short、Integer、String或枚举类型”,谢谢,
    findInDataBase
    在数据库中找不到项时抛出一个
    fileNotFoundException
    异常。不是布尔值。如果未找到任何内容,我希望返回已确认的唯一术语。如何完成while
    语句?