从try块跳转到finally块

3

我想要做以下事情:

String txt = "begin\n";

try{

    // some stuff

    if(some condition)
        JUMP TO FINALLY CODE

    // some other stuff

} finally {

    String txt += "end\n";
    return txt;

}

有没有一种方法可以实现JUMP TO FINALLY CODE而不引发异常(在我看来,引发异常不太美观)


基本解决方案:如果(!某些条件){ //所有语句之后 },那么它会自动跳转到最终。 - Vikas Verma
6个回答

12

是的,一种方法是只需像这样从方法中return

String txt = "begin\n";

    try{

        // some stuff

        if(some condition)
            return;

        // some other stuff

    } finally {

        String txt += "end\n";

    }

4
嗯,你会错过finally之后的部分。该方法在执行完finally代码块后将停止执行。 - Dmitry Ginzburg
很好的观点Dmitry,但如果if条件中的return跳转到最终代码,那对我来说没问题! - Backslash36
小技巧:这段代码出现在 toString() 方法中。如果我想在 finally 块中返回一些东西怎么办?if 中的返回语句会被丢弃吗?无论如何,这对读者来说都不太清晰... - Backslash36
@sol4me 我有点困惑,假设方法的返回类型是void,那它怎么工作呢? - Vikas Verma
@Backslash36 - 无论你在最终块中返回什么,都将被返回。因此,if条件的值不会被返回。 - TheLostMind
以上仅适用于如果你想从函数返回的情况。如果在try块后面有代码,那么这样做就行不通了。基本上我们要回答如何一般性地执行finally块的问题。 - Marshall Jobe

6

不需要任何方法跳转到 finally,因为这里总是会执行 finally 块。不管是否有 Exception

如果你不想执行下面的代码行,你可以使用 return

 try {
      if(isThisShouldReturn()){
          return; // when if satisfied will return from try
      } else {
          // do the stuff
      }
  }finally {
      System.out.println("come to finally");
  }

然后他应该将其他代码封装在else分支中。 - Joachim Rohde
我在try块内有很多if语句,我想保持代码的可读性。return关键字可以解决这个问题! - Backslash36
@VikasVerma 上面的代码片段本身就有答案了。如果条件不匹配,则 if else 外面的任何代码都不会被执行。 - Ruchira Gayan Ranaweera
但是假设我有这样的代码 void go(){ return; },那意味着什么? - Vikas Verma
1
@VikasVerma 没有人想写毫无意义的代码。代码的意义取决于你如何编写它。在这种情况下,没有任何意义。 - Ruchira Gayan Ranaweera
显示剩余2条评论

3

我的做法是否定条件:

String txt = "begin\n";

try{        
    // some stuff

    if(!someCondition) {
        // some other stuff
    }

} finally {     
    String txt += "end\n";
}

这将实现您示例中的预期行为。

@VikasVerma 抱歉,我没看到。你在我回答的时候写了你的评论。 - André Stannek
2
@Vikas Verma的答案是正确的,为什么你要踩它呢?如果你想的话,你也可以回答的... - Alboz
@VikasVerma - 没有人要求你将那个答案写成评论。 - TheLostMind

1

你需要使用一个块标签结合 break;,类似于:

end_try: try {
  ...
  break end_try;
  ...
} finally {
  ...
}

或者:

try {
  ...
  end_try: {
     break end_try;
  }

} finally {
  ...
}

1

//在try块中抛出异常或使用return调用:

try
{
  if(true condition)
  {
    return;
  }
  else
  {
    //false condition do work....
  }
}

finally
{
   //always executed.
}

0

我猜return和通过抛出异常是你可以从try块到达finally块的唯一两种方式。


2
不是这样的。无论是否存在异常,finally块都会执行。 - Ruchira Gayan Ranaweera

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