윌 null instanceof SomeClass
반환 false
또는 던져 NullPointerException
?
윌 null instanceof SomeClass
반환 false
또는 던져 NullPointerException
?
답변:
아니요, instanceof를 사용하기 전에 null 검사가 필요하지 않습니다.
표현식 x instanceof SomeClass
은 false
if x
입니다 null
.
Java 언어 사양, 섹션 15.20.2, "유형 비교 연산자 instanceof"에서 :
"런타임에서
instanceof
연산자 의 결과true
는 RelationalExpression 의 값 이 아닌null
경우 참조는 을 올리지 않고 ReferenceType 으로 캐스트 할 수 있습니다ClassCastException
. 그렇지 않으면 결과는false
" 입니다 . "
따라서 피연산자가 널이면 결과는 false입니다.
try it
않기 때문에 보다 정확합니다 .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
운영자는 거의 20 년 전에 릴리스 된 Java 1.0의 일부였습니다. 기존 코드를 손상시킬 수있는 방식으로 동작을 변경하는 것은 그리 큰 비용이 들지 않는 이점이 없습니다. 20 년 전, 인수가 캐스트 될 수 있거나 널 (null) 인수에 대한 예외를 던지는 경우 true를 리턴하기위한 인수가있을 수 있습니다. 그러나 이러한 정의에는 별도의 null 검사가 필요했습니다.
정말 좋은 질문입니다. 방금 시도했습니다.
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 / 15.20.2. 유형 비교 연산자 instanceof
런타임시
instanceof
연산자 의 결과true
는 RelationalExpression 의 값 이 아니고 참조를 을 올리지 않고 ReferenceTypenull
으로 캐스트 할 수있는 경우 입니다. 그렇지 않으면 결과는 입니다.ClassCastException
false
이
Class
객체가 인터페이스를 나타내는 경우,이 메소드는true
, 지정된Object
인수 의 클래스 또는 슈퍼 클래스 가이 인터페이스를 구현 하고있는 경우를 돌려줍니다 .false
그렇지 않으면 반환 합니다. 이Class
객체가 원시적 형을 나타내는 경우 ,이 메소드는를 리턴합니다false
.
s
은 객체 참조 변수 일뿐 입니다. 실제로 존재하는 객체 ( ""
)를 참조하거나 null
리터럴 참조를 참조 할 수 있습니다.
null
변수가 가리키는 변수에 관계없이 문자열 데이터가 아닙니다. 예를 들어와 s instanceof String
같지 않습니다 field.getType().equals(String.class)
.
s instanceof String
이 s
그가 될 수 있도록, 실제 값으로 대체됩니다 "" instanceof String
및 null instanceof String
. 이와 같이 생각하는 것이 더 합리적 일 수 있습니다.
아뇨. 첫 번째 피연산자가 인 경우 instanceof
반환 false
됩니다 null
.
깔끔한 것처럼 :
심지어 돌아올 것이다 .(
((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 instanceof A: false
.)
추신 : 고용하는 경우, 이것을 면접 질문으로 사용하지 마십시오. :디
없음 . Java 리터럴 null
은 어떤 클래스의 인스턴스도 아닙니다. 따라서 클래스 의 인스턴스가 될 수 없습니다 . instanceof
중 반환 false
또는true
때문에 <referenceVariable> instanceof <SomeClass>
반환 false
할 때 referenceVariable
값이 null입니다.
instanceof
운영자는 명시 적으로 필요하지 않습니다 null
그것은 포기하지 않는 한, 검사를 NullPointerException
피연산자 인 경우 null
.
런타임시, instanceof
관계식의 값이 아니고 null
클래스 캐스트 예외를 발생시키지 않고 참조를 참조 유형으로 캐스트 할 수있는 경우 연산자 결과 는 true 입니다.
피연산자가 null
이면 instanceof
연산자가 반환 false
되므로 명시적인 null 검사가 필요하지 않습니다.
아래 예를 고려하십시오.
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");
}
}