Pad*_*rag 82
您可以使用带标签的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功能.
Ste*_*n C 42
goto在Java中没有任何直接等同的概念.有一些结构可以让你做一些经典的事情goto.
break和continue语句,可以跳出一个块的循环或switch语句.break <label>允许您跳出任意复合语句到给定方法(或初始化程序块)中的任何级别.continue <label>继续从内循环开始外循环的下一次迭代.return.这些Java构造中没有一个允许您在与当前语句相同的嵌套级别向后或向代码中的某个点进行分支.它们都跳出一个或多个嵌套(范围)级别,它们全部(除了continue)向下跳跃.这种限制有助于避免旧BASIC,FORTRAN和COBOL代码2中固有的goto"意大利面条代码"综合症.
1-异常中最昂贵的部分是异常对象及其堆栈跟踪的实际创建.如果您确实需要对"常规"流控制使用异常处理,则可以预先分配/重用异常对象,或者创建覆盖该fillInStackTrace()方法的自定义异常类.缺点是异常的printStackTrace()方法不会给你有用的信息......如果你需要调用它们.
2  - 意大利面条代码综合症产生了结构化编程方法,在这种方法中,您限制使用可用的语言结构.这可以应用于BASIC,Fortran和COBOL,但它需要谨慎和纪律.goto完全摆脱是一个务实的更好的解决方案.如果你用一种语言保留它,总会有一些小丑会滥用它.
Pas*_*ent 30
只是为了好玩,这是Java中的GOTO实现.
例:
Run Code Online (Sandbox Code Playgroud)1 public class GotoDemo { 2 public static void main(String[] args) { 3 int i = 3; 4 System.out.println(i); 5 i = i - 1; 6 if (i >= 0) { 7 GotoFactory.getSharedInstance().getGoto().go(4); 8 } 9 10 try { 11 System.out.print("Hell"); 12 if (Math.random() > 0) throw new Exception(); 13 System.out.println("World!"); 14 } catch (Exception e) { 15 System.out.print("o "); 16 GotoFactory.getSharedInstance().getGoto().go(13); 17 } 18 } 19 }运行它:
Run Code Online (Sandbox Code Playgroud)$ java -cp bin:asm-3.1.jar GotoClassLoader GotoDemo 3 2 1 0 Hello World!
我需要添加"不要使用它!"?
Luk*_*der 17
虽然一些评论者和下载者认为这不是goto,但是来自以下Java语句的生成字节码确实表明这些语句确实表达了goto语义.
具体而言,do {...} while(true);第二个示例中的循环由Java编译器优化,以便不评估循环条件.
label: {
  // do stuff
  if (check) break label;
  // do more stuff
}
在字节码中:
2  iload_1 [check]
3  ifeq 6          // Jumping forward
6  ..
label: do {
  // do stuff
  if (check) continue label;
  // do more stuff
  break label;
} while(true);
在字节码中:
 2  iload_1 [check]
 3  ifeq 9
 6  goto 2          // Jumping backward
 9  ..
如果你真的想要像goto语句这样的东西,你总是可以尝试打破命名块.
您必须在块的范围内才能打破标签:
namedBlock: {
  if (j==2) {
    // this will take you to the label above
    break namedBlock;
  }
}
我不会告诉你为什么你应该避免转到 - 我假设你已经知道了答案.
| 归档时间: | 
 | 
| 查看次数: | 220502 次 | 
| 最近记录: |