윌 null instanceof SomeClass반환 false또는 던져 NullPointerException?
윌 null instanceof SomeClass반환 false또는 던져 NullPointerException?
답변:
아니요, instanceof를 사용하기 전에 null 검사가 필요하지 않습니다.
표현식 x instanceof SomeClass은 falseif 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으로 캐스트 할 수있는 경우 입니다. 그렇지 않으면 결과는 입니다.ClassCastExceptionfalse
이
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");
}
}