Java 中 goto 语句的替代方法

2022-08-31 11:57:36

Java中goto关键字的替代函数是什么?

因为Java没有goto。


答案 1

您可以使用带标签的 BREAK 语句:

search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }

但是,在正确设计的代码中,您不需要 GOTO 功能。


答案 2

Java中没有任何与这个概念直接等效的概念。有一些结构允许您使用经典做一些事情gotogoto

  • and 语句允许您跳出循环或 switch 语句中的块。breakcontinue
  • 一个带标签的语句,允许您从任意复合语句跳转到给定方法(或初始值设定项块)中的任何级别。break <label>
  • 如果标记循环语句,则可以继续从内部循环进行外部循环的下一次迭代。continue <label>
  • 抛出和捕获异常允许您(有效地)跳出方法调用的许多级别。(但是,异常相对昂贵,并且被认为是执行“普通”控制流1的不良方法。
  • 当然,还有.return

这些 Java 构造都不允许您在与当前语句相同的嵌套级别上向后分支或分支到代码中的某个点。它们都跳出一个或多个嵌套(范围)级别,并且它们(除了)向下跳。这种限制有助于避免旧的BASIC,FORTRAN和COBOL代码2中固有的goto“意大利面条代码”综合症。continue


1- 异常最昂贵的部分是实际创建异常对象及其堆栈跟踪。如果您确实需要对“正常”流控制使用异常处理,则可以预先分配/重用异常对象,或者创建一个重写 fillInStackTrace() 方法的自定义异常类。缺点是异常的printStackTrace()方法不会给你有用的信息......如果您需要打电话给他们。

2 - 意大利面条式代码综合症催生了结构化编程方法,在这种方法中,您对可用语言结构的使用受到限制。这可以应用于BASICFortranCOBOL,但它需要注意和纪律。完全摆脱goto是一个务实的更好的解决方案。如果你把它放在一种语言中,总会有一些小丑会滥用它。