instance of를 호출하기 전에 null 체크가 필요합니까?
할 것이다null instanceof SomeClass
돌아가다false
또는 던지다NullPointerException
?
아니요, instance of를 사용하기 전에 null 검사가 필요하지 않습니다.
표현x instanceof SomeClass
이false
한다면x
이null
.
Java 11 Language Specification은 이것을 섹션 15.20.2의 "타입 비교 연산자 인스턴스"에서 간결하게 표현하고 있습니다(Java 17은 패턴 매칭 인스턴스의 도입 후 이를 보다 간결하게 표현합니다).
「실행시에, 그 결과는,
instanceof
오퍼레이터는true
RelationalExpression 값이 아닌 경우 참조를 ReferenceType으로 캐스팅할 수 있습니다.ClassCastException
그렇지 않으면 결과는 다음과 같습니다.false
."
따라서 오퍼랜드가 null일 경우 결과는 false입니다.
null 참조를 첫 번째 오퍼랜드로 사용하여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
실행 시 의 결과
instanceof
오퍼레이터는true
RelationalExpression 값이 다음 값이 아닌 경우null
참조는, 「ReferenceType(참조 타입)」에 캐스트 할 수 있습니다.ClassCastException
그렇지 않으면 결과는 다음과 같습니다.false
.
이 경우
Class
object는 인터페이스를 나타냅니다.이 메서드는true
지정된 클래스 또는 슈퍼클래스가Object
인수는 이 인터페이스를 구현합니다.false
그렇지않으면.이 경우Class
object는 기본 유형을 나타냅니다. 이 메서드는 반환됩니다.false
.
아니야. 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
.)
추신: 만약 채용을 하고 있다면, 이것을 면접 질문으로 사용하지 말아 주세요.:D
그instanceof
연산자는 명시적일 필요가 없습니다.null
체크는, 송신되지 않기 때문에,NullPointerException
오퍼랜드가null
.
실행 시 의 결과instanceof
연산자는 관계식의 값이 true가 아닌 경우 true입니다.null
클래스 캐스팅 예외를 발생시키지 않고 참조 유형을 캐스팅할 수 있습니다.
오퍼랜드가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");
}
}
- 인스턴스 전에 null 검사가 필요하지 않습니다.
- 인스턴스가 true로 검증된 후에는 null 체크가 필요하지 않습니다.
다음은 null-safe입니다.
if(couldbenull instanceof Comparable comp){
return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
return ((Comparable)couldbenull).compareTo(somethingElse);
}
ㅇㅇㅇㅇ, ᄋ.null
은 필요 .instanceof
. 이 false이면 null
.
Java Language Specification(Java 언어 사양)에 따라 비교합니다.instanceof
.
실행 시 RelationalExpression 값이 null이 아니며 ClassCastException을 발생시키지 않고 참조를 ReferenceType으로 캐스팅할 수 있는 경우 instanceof 연산자의 결과가 true입니다.그렇지 않으면 결과는 거짓입니다.
에는 '자바'라는 을 알 수 .null
이 늘은, 이 늘 타입은, 「」로 됩니다.instanceof
false(거짓)
Java 프로그래밍 언어에는 원시 유형과 참조 유형의 두 가지 유형이 있습니다.유형 및 값에 대한 Java 사양에 따름
또한 특별한 null 타입이 있습니다.식 null 타입에는 이름이 없습니다.null 타입에는 이름이 없기 때문에 null 타입의 변수를 선언하거나 null 타입으로 캐스트 할 수 없습니다.null 참조는 null 유형의 식에서 사용할 수 있는 유일한 값입니다.null 참조는 항상 모든 참조 유형으로 확대된 참조 변환을 수행할 수 있습니다.
, 에서는 확장 14, LTS Java 이 있습니다.instanceof
·타입 비교 후 캐스트를 하는 패턴 매칭 기능이 있습니다.
예
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
언급URL : https://stackoverflow.com/questions/2950319/is-null-check-needed-before-calling-instanceof
'programing' 카테고리의 다른 글
(Flux) 상태 관리에서 명명된 속성 대신 정적 함수를 사용하지 않는 이유는 무엇입니까? (0) | 2022.08.13 |
---|---|
퍼포먼스 트레이드오프 - MATLAB가 C/C++보다 우수하거나 느린 경우 (0) | 2022.08.13 |
16진수의 printf() 포맷 (0) | 2022.08.13 |
계산된 get에 대한 스파이 기능 (0) | 2022.08.13 |
UNIX 터미널 응용 프로그램의 컬러 텍스트 (0) | 2022.08.13 |