Java 我怎样才能贴上标签并从挡块中挣脱出来?

Java 我怎样才能贴上标签并从挡块中挣脱出来?,java,break,Java,Break,我的代码中有一个try…catch结构: try { // Some code. } catch (Exception e) { if (condition) { // Break out of catch block. } // Continue catch block. } 如何标记我的catch块,以便写入break label\u NAME代替了//中断catch块。,这样执行将完全退出try…catch构造 尝试 我希望能够在catch

我的代码中有一个
try…catch
结构:

try {
    // Some code.
} catch (Exception e) {
    if (condition) {
        // Break out of catch block.
    }
    // Continue catch block.
}
如何标记我的
catch
块,以便写入
break label\u NAME
代替了
//中断catch块。
,这样执行将完全退出
try…catch
构造

尝试 我希望能够在
catch
关键字前放置标签:

try { }
LBL: catch(Exception e) { }
因为在许多其他语言构造(例如,
LBL:if(…
LBL:for(…
)中,标签会位于关键字之前,但这会引发语法错误

我也无法将标签放在
catch(异常e)
code之后

编辑 这个问题纯粹是出于对如何在Java中实现这一点的好奇,我非常清楚还有其他方法可以控制代码块中的执行流


如果我遇到标记了
catch
或类似块的代码,并使用该标签从块中断开,我想确切地知道代码在做什么,以及它是如何做的。

我在评论中关于是否应该使用标签的辩论中的立场:我的立场是不惜一切代价避免使用标签,除非alterna情况更糟

在这种情况下,似乎最简单的方法是反转条件:

try {
    // Some code.
} catch (Exception e) {
    if (!condition) {
      // Continue catch block.
    }
}
假设
Continue catch块
代码不是很大(这本身就是不可取的),这似乎比涉及标签要好


作为另一种选择,虽然不能标记
catch
(因为它不是语句),但可以在
catch
中定义标记的块(因为块是语句):

这是相当严重的,但有一个优势,即标签更接近中断(例如,如果“
//某些代码
”非常长,则可能不清楚您正在中断什么)


然而,如果你在这里引入额外的缩进级别,你也可以将其用于
if(!condition)

我在评论辩论中的立场,关于是否应该使用标签:我的立场是不惜一切代价避免,除非选择更糟糕

在这种情况下,似乎最简单的方法是反转条件:

try {
    // Some code.
} catch (Exception e) {
    if (!condition) {
      // Continue catch block.
    }
}
假设
Continue catch块
代码不是很大(这本身就是不可取的),这似乎比涉及标签要好


作为另一种选择,虽然不能标记
catch
(因为它不是语句),但可以在
catch
中定义标记的块(因为块是语句):

这是相当严重的,但有一个优势,即标签更接近中断(例如,如果“
//某些代码
”非常长,则可能不清楚您正在中断什么)


然而,如果你在这里引入了额外的缩进级别,你也可以用它来代替
if(!condition)

最好的方法是把你的代码放在一个函数中,比如foo。这总是比在catch块中使用另一个try catch更好的选择

public void foo(Boolean condition){
   try {
        // Some code.
       } catch (Exception e) {
          if (condition) {
             // Break out of catch block.
             return; 
          }
         // Continue catch block.
     }
}
如果在尝试之后或之前有任何代码:

public void bar(){
  // your code
  foo(codition);
  // your code.
}

最好的方法是将代码放在一个函数中,比如说foo。这总是比在catch块中使用另一个try-catch更好的选择

public void foo(Boolean condition){
   try {
        // Some code.
       } catch (Exception e) {
          if (condition) {
             // Break out of catch block.
             return; 
          }
         // Continue catch block.
     }
}
如果在尝试之后或之前有任何代码:

public void bar(){
  // your code
  foo(codition);
  // your code.
}

要突破
捕获
尝试
需要标记:

LABEL: try {
   // Some code.
} catch(Exception e) {
   if(condition) {
      break LABEL;
   }
   // Remaining code.
}

同样,我确信有很多更好的代码替代方案,但这回答了问题的明确要求。

要打破
陷阱,需要标记
try

LABEL: try {
   // Some code.
} catch(Exception e) {
   if(condition) {
      break LABEL;
   }
   // Remaining code.
}

同样,我确信有很多更好的代码替代,但这回答了问题的明确问题。

为什么不
if(condition){…}else{…}
你永远不应该使用标签。结构化编程不是这样工作的……你应该很少使用标签如何使用嵌套for循环已经是一个坏主意。提示。你想了解干净的代码,以及为什么你在嵌套任何东西时非常小心。是的,对catch块使用标签是一个糟糕的主意。告诉从另一方面来说,这是一个很好的建议。为什么不
if(condition){…}else{…}
你永远不应该使用标签。结构化编程不是这样工作的……你应该很少使用标签如何使用嵌套for循环已经是一个坏主意。提示。你想了解干净的代码,以及为什么你在嵌套任何东西时非常小心。是的,对catch块使用标签是一个糟糕的主意。告诉另一方面,请不要这样做:这是一个很好的建议。假设Continue catch块代码不是很大(这本身就是不可取的),除非这是问题的关键,我不明白为什么需要标签。假设Continue catch块代码不是很大(这本身就是不可取的)除非这是问题的关键,否则我不明白为什么需要标签。这只有在尝试后没有任何内容时才可能,很明显。@AndyTurner这就是为什么我要说将此尝试捕获放在单独的函数中,并与父函数分开,在父函数中尝试调用后有代码。只有在尝试后没有任何内容时才可能,清楚吗ly.@AndyTurner这就是为什么我说把这个try-catch放在单独的函数中,从父函数中,在try-call之后有代码。我甚至不知道这是一件有趣的事情,谢谢!我甚至不知道这是一件有趣的事情,谢谢!