Instanceof Operator 不需要显式的null检查

这篇文章是有关Java鲜为人知的功能系列的一部分。较早的帖子介绍了从同一类访问私有成员使用类sun.misc.Unsafe的实例以及通过构造函数初始化构造器块引发的检查异常。在本文中,我将讨论初学者开发人员在使用instanceof Operator 时采用的一种非常常见的做法。

您遇到过几次这种类型的代码:

	if(list != null && list instanceof ArrayList)              //Null check not needed
	{
		//Some application logic
	}

好吧,关键是您不需要在这里进行显式的null检查。instanceof Operator 在内部为您完成。所以下面的代码是有效的示例:

package com.how2codex.demo;

import java.util.ArrayList;
import java.util.List;

public class InstanceOfTest
{
	static List<String> list = null;
	
	public static void main(String[] args) {
		
		if(list instanceof ArrayList){                     //Correct way
			System.out.println("In if block");
		}
		else
		{
			System.out.println("In else block");
		}
	}
}

Output:

In else block

逻辑推理

根据jls规范,在运行时,如果RelationalExpression的值不为null,并且引用可以转换为ReferenceType而不引发ClassCastException,则instanceof Operator 的结果为true。否则结果为假。

在第一行中还说:“ instanceof Operator 的RelationalExpression操作数的类型必须是引用类型或null类型;否则,将发生编译时错误。”

这意味着java也有一个称为null类型的东西,并且在instanceof Operator 中检查了此null类型,该 Operator 显然会返回false,因为它期望使用ArrayList类型。

伙计们,我很欢迎大家,只要您能通过上述两项陈述得出任何充分的理由。

学习愉快!

saigon has written 1440 articles

Leave a Reply