SomeClass的null实例是否返回false或引发NullPointerException?
当前回答
使用空引用作为instanceof的第一个操作数将返回false。
其他回答
不,在调用instanceof之前不需要进行null检查。如果其值为空,则始终返回false。
根据Java语言规范,使用instanceof进行比较。
在运行时,如果RelationalExpression的值不为空,引用可能在不引发ClassCastException的情况下强制转换为ReferenceType。否则结果为假
因此,我们可以推断java也有一种叫做null类型的东西,并且在instanceof运算符中检查这个null类型,因为它需要一个特定的类型,所以显然返回false。
Java编程语言中有两种类型:原始类型和引用类型。根据Java规范的类型和值
还有一种特殊的null类型,它没有名字。因为空类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。null引用是null表达式的唯一可能值类型空引用始终可以进行扩展引用转换为任何引用类型。
从Java14开始,特别是在LTS Java17中,我们有一个增强的实例。我们有模式匹配功能,在类型比较后执行强制转换。
实例
public static void main(String[] args) {
Object testObject = "I am a string";
List<Object> testList = null;
if (testList instanceof List) {
System.out.println("instance of list");
} else {
System.out.println("null type");
}
//Enhanced instanceof with type conversion - tested with JDK 17
if (testObject instanceof String str) {
System.out.println(str.toUpperCase());
}
}
输出
null type
I AM A STRING
使用空引用作为instanceof的第一个操作数将返回false。
instanceof之前不需要null检查在instanceof验证为true后,不需要进行null检查
以下是空安全的:
if(couldbenull instanceof Comparable comp){
return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
return ((Comparable)couldbenull).compareTo(somethingElse);
}
不,不是。如果第一个操作数为空,instanceof将返回false。
instanceof运算符不需要显式的null检查,因为如果操作数为null,它不会引发NullPointerException。
在运行时,如果关系表达式的值不为null,则instanceof运算符的结果为true,并且可以将引用转换为引用类型,而不会引发类转换异常。
如果操作数为空,instanceof运算符将返回false,因此不需要显式的空检查。
考虑以下示例,
public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
instanceof的正确用法如下所示,
public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- getActivity()在Fragment函数中返回null
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?