java带标签的continuebreak

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java带标签的continuebreak相关的知识,希望对你有一定的参考价值。

ViewBinding会自动生成一个Binding类。我的项目中,有个ActivityMainBinding类,源码中有如下代码:

  @NonNull
  public static ActivityMainBinding bind(@NonNull View rootView) 
    // The body of this method is generated in a way you would not otherwise write.
    // This is done to optimize the compiled bytecode for size and performance.
    int id;
    missingId: 
      id = R.id.tv_hello;
      TextView tvHello = rootView.findViewById(id);
      if (tvHello == null) 
        break missingId;
      

      return new ActivityMainBinding((ConstraintLayout) rootView, tvHello);
    
    String missingId = rootView.getResources().getResourceName(id);
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  

上面的那个missingId: 既不是lambda表达式,也不是三目运算符,这是什么鬼?

是带标签的break
先不管标签,我们先搞清楚上面的代码执行顺序。我模仿上面的代码,写了个简单的测试例子:

public class JavaLabelTest2 
    public static void main(String[] args) 
        Object target = bind();
        System.out.println(target == null);
    
    public static Object bind() 
        int id;
        missingId: 
            id = 1;
            Object tvHello = findObject(id);
            if (tvHello == null) 
                System.out.println("执行");
                break missingId;
            
            return tvHello;
        
        String missingId = "viewId" + id;
        throw new NullPointerException("Missing required view with ID: ".concat(missingId));
    

    public static Object findObject(int id) 
        return null;
    

看下输出:

并没有输出true或者false,而是抛出了异常,说明return tvHello;没有执行,被break missingId;中断掉了。可以看到源码作者,使用带标签的break的作用,就是中断代码执行。

注意源码里面,还有两行英语注释,翻译过来是:

此方法的主体是以您不会编写的方式生成的。这样做是为了优化已编译的字节码的大小和性能。

我不确定,这是不是作者采用带标签的break的根本目的,欢迎大神赐教。不扯远了,回到标签,下面是几个关于标签的疑问:



标签是什么鬼?

在《Java编程思想》第4版,88页,对标签做了详细的解释。

上图中,可能还是讲解的不够详细,建议仔细看这篇博客:Java基础—break label 带标签的break语句的用法,里面的代码和输出结果可以帮你理解。



标签是不是只能用在循环语句中?

在《Java核心技术卷1》75页有这样的描述:

所以,标签可以应用到任何语句中,文章开头的ViewBinding就不用于循环语句。

以上是关于java带标签的continuebreak的主要内容,如果未能解决你的问题,请参考以下文章

关于java的continuebreak关键字用法

Java中关键字continuebreak和return的区别

Java中关键字continuebreak和return的区别

shell脚本--continuebreak

带标签的 break 和 continue (Java)

java带标签的break语句,跳出多重嵌套循环语句