有没有一种简单的方法可以跳出Java代码块?

7

我在想是否有办法跳出 Java 代码块。它可以是任何代码块 - if 代码块,for 代码块或者甚至只是一个 {}。

这是因为我经常遇到这种情况。

{
  retCode = performSomeThing();
  if(retCode == SUCCESS)
  {
    retCode = performSomethingElse();
    if(retCode == SUCCESS)
    {
         . . . 
          . . . 
    }
   }
}

这种多级缩进让我写的代码变得混乱。

相反,我需要一些方法来解决这个问题。

if((retCode = performSomething()) != SUCCESS)
  GET_OUT_OF_BLOCK
if((retCode = performSomethingElse()) != SUCCESS)
  GET_OUT_OF_BLOCK

根据retCode的值,我将在块外执行任何必要的处理。最好不要在try-catch块内编写该块,也不要创建新的异常类型、抛出它并捕获它。

2
我的面向对象的goto在哪里? - Alexander Pogrebnyak
Java 中实际上是有 goto 的。如果我发现你使用它,我会割掉你的耳朵。 - defines
2
@Dustin:在Java中使用goto是不可能的 - 它是一个保留字(即不是合法标识符),但实际上并没有用于任何事情。 - Michael Borgwardt
2
不可能是不存在的。硬核程序员直接编写字节码,并经常使用goto操作码。 - emory
@emory,这使得这个问题成为一个相关的问题。 - Pops
回想起来,我曾经认为“每个方法应该只有一个返回值”,这种想法非常愚蠢。 - Jagat
4个回答

20

使用正确的结构是return。这意味着你示例中的块应该真正是一个方法,但无论如何这都是一个好主意——包含多个复杂控制流替代方案的方法是一种反模式。今天就为自己做个好事,切换到“每个方法一个目标”!<福音讲完了>


7

看一下breakcontinue


另外唯一正确的答案,为什么没有被投票赞同呢? - defines

2

您似乎在这里使用嵌套的if来处理错误。

如果您切换到结构化异常处理,也许可以完全摆脱深度嵌套的if结构。

然而,这意味着performSomeThing()performSomethingElse()将抛出异常而不是返回错误代码。


2
在非异常情况或控制流程中使用异常绝对不是推荐的做法。 - eljenso
@eljenso:如果您需要因为某个操作未成功而中止处理,那么使用异常是一个很好的选择。但这总是有点主观判断的... - sleske
2
@eljenso:当合理地让异常在调用堆栈上传播时,异常对于验证错误非常好。异常和返回代码之间的决策不应该基于对“异常情况”究竟是什么的微小分歧,而是基于哪个能够导致更好的设计。必须不能被忽略并且必须传递的错误代码是不好的,无论其原因是什么。 - Michael Borgwardt
@Michael,确实是关于更好的设计。对于程序预期要处理的事情,使用异常来进行“正常”的控制流通常不是最佳选择。这并不涉及到吹毛求疵,因为你知道你的程序应该做什么,对吧? - eljenso
根据这种逻辑,异常应该只用于导致程序中止的情况(即它们基本上不应该被捕获)。关于什么是或不是“正常控制流”的争论最终会陷入边缘情况的纠结。在我看来,“异常”这个名称是一个误导。它们只是另一种流程控制结构,允许将控制传递到调用堆栈上。对于不涉及直接调用方法的事情,它们比返回代码更好;对于该方法将处理的事情,它们不太好;对于方法内部的流程控制,它们非常糟糕。 - Michael Borgwardt
显示剩余2条评论

-1

<再次传教>

不要那样做。在我看来,一个块的正确方式是从开始到结束只有一个起点和终点,完整无缺。

即使使用方法,你也应该只在最后返回一次。

在块内,你应该用if等语句编写运行指令的流程,从开始到结束,尽可能简单(所以有时候你会在其中写return或break等,这应该是例外情况)。

最好(但不是必须的)写上正常完成语句


-1表示提供个人观点而非技术正确答案 - Pops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接