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和return的区别