SomeClass的null实例是否返回false或引发NullPointerException?
当前回答
这个问题确实很好。我只是试着自己。
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
打印
true
true
false
false
JLS/1520.2。类型比较运算符实例
在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且引用可以在不引发ClassCastException的情况下强制转换为ReferenceType。否则,结果为假。
API/Class#isInstance(对象)
如果此Class对象表示接口,则如果指定object参数的类或任何超类实现了此接口,则此方法返回true;否则返回false。如果此Class对象表示基元类型,则此方法返回false。
其他回答
使用空引用作为instanceof的第一个操作数将返回false。
这个问题确实很好。我只是试着自己。
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
打印
true
true
false
false
JLS/1520.2。类型比较运算符实例
在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且引用可以在不引发ClassCastException的情况下强制转换为ReferenceType。否则,结果为假。
API/Class#isInstance(对象)
如果此Class对象表示接口,则如果指定object参数的类或任何超类实现了此接口,则此方法返回true;否则返回false。如果此Class对象表示基元类型,则此方法返回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);
}
作为一个小插曲:
偶数(((A)null)instanceof A)将返回false。
(如果类型转换为null似乎令人惊讶,有时您必须这样做,例如在以下情况下:
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
因此Test.Test((A)null)将打印A:false的实例。)
备注:如果你正在招聘,请不要将此作为求职面试问题D
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");
}
}
推荐文章
- getResourceAsStream返回null
- 如何使用Java中的Scanner类从控制台读取输入?
- 如何添加JTable在JPanel与空布局?
- Statement和PreparedStatement的区别
- 为什么不能在Java中扩展注释?
- 在Java中使用UUID的最重要位的碰撞可能性
- 转换列表的最佳方法:map还是foreach?
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?