3 回答

TA贡献1818条经验 获得超8个赞
goto
Java中没有直接等效的概念。有几种构造可以让您完成经典作品可以做的一些事情goto
。
该
break
和continue
语句,可以跳出一个块的循环或switch语句。带标签的语句,
break <label>
允许您从任意复合语句跳到给定方法(或初始化程序块)内的任何级别。如果标记了循环语句,则可以
continue <label>
从内部循环继续进行外部循环的下一次迭代。引发和捕获异常可以使您(有效)跳出方法调用的多个级别。(但是,异常的代价相对较高,被认为是进行“常规”控制流程1的一种不好的方法。)
当然有
return
。
这些Java构造均不允许您在与当前语句相同的嵌套级别上向后或分支到代码中的某个点。它们都跳出一个或多个嵌套(作用域)级别,并且所有(除之外continue
)都向下跳。此限制有助于避免旧的BASIC,FORTRAN和COBOL代码2固有的goto“意大利面条代码”综合症。
1-异常中最昂贵的部分是异常对象及其堆栈跟踪的实际创建。如果确实需要将异常处理用于“常规”流控制,则可以预分配/重用异常对象,或者创建一个覆盖该fillInStackTrace()
方法的自定义异常类。缺点是异常的printStackTrace()
方法不会为您提供有用的信息……如果您需要调用它们的话。
2-意大利面条式代码综合症催生了结构化编程方法,您在其中限制了对可用语言结构的使用。这可以应用于BASIC,Fortran和COBOL,但是需要谨慎和纪律。goto
完全摆脱掉是一个务实的更好解决方案。如果您以某种语言来保存它,总是会有一些小丑会滥用它。

TA贡献1801条经验 获得超16个赞
您可以使用带标签的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功能。
添加回答
举报