java带标签的continue、break

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就不用于循环语句。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值