Java에서 "(Object) null"과 "null"의 차이점은 무엇입니까?
이 질문에 이미 답이 있습니다.
다음 예를 살펴보십시오.
class nul
{
public static void main (String[] args)
{
System.out.println (String.valueOf((Object)null));
System.out.println (String.valueOf(null));
}
}
첫 번째 println
는 null
쓰지만 두 번째는 NullPointerException
.
두 번째 줄만 예외로 인정되는 이유는 무엇입니까? 그리고 두 null
s 의 차이점은 무엇 입니까? Java 에는 진짜 null
와 가짜 null
가 있습니까?
첫 번째 호출은 호출 String.valueOf(Object)
명시 적으로 typecasted 것처럼, 방법 null
에 Object
대한 참조입니다. 반대로 두 번째 String.valueOf(char[])
메서드 는 인수 char[]
보다 더 구체적이므로 오버로드된 메서드 를 호출합니다 .Object
null
기본 매개변수를 허용하는 이 메소드의 다른 오버로드된 버전이 있지만 이는 null
인수에 대해 유효한 일치가 아닙니다 .
에서 §15.12.2 JLS :
이러한 방법이 둘 이상 있을 수 있으며 이 경우 가장 구체적인 방법이 선택됩니다. 가장 구체적인 메소드의 디스크립터(서명 + 리턴 유형)는 메소드 디스패치를 수행하기 위해 런타임에 사용되는 디스크립터입니다.
메서드는 하위 유형 지정(§15.12.2.2), 메서드 호출 변환(§15.12.2.3) 또는 적용 가능한 가변 arity 메서드(§15.12.2.4)인 경우에 적용할 수 있습니다.
[...]
적용 가능성 테스트의 세 단계 중 하나에서 여러 적용 가능한 방법이 식별된 경우 섹션 §15.12.2.5에 지정된 대로 가장 구체적인 방법이 선택됩니다.
이제 두 메서드의 소스 코드를 확인합니다.
// This won't throw NPE for `obj == null`
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
// This will throw `NPE` for `data == null`
public static String valueOf(char data[]) {
return new String(data);
}
String.valueOf
Java 에는 오버로드된 메소드 가 많이 있습니다 . 또한 Java null
에는 모든 유형이 있으므로 기본이 아닌 모든 것이 null
.
그래서, 때 전화 (String.valueOf((Object)null)
하면 전화 valueOf
걸리는 방법을 Object
명시 적으로 캐스팅 사용로 null
로를 Object
.
두 번째 예에서는 명시적으로 null
특정 유형 으로 캐스팅하지 않으므로 실제로 NPE를 throw하는 valueOf
메서드 를 호출합니다 char[]
.
로부터 JLS §15.12.2
두 번째 단계는 이전 단계에서 결정된 유형에서 멤버 메소드를 검색합니다. 이 단계에서는 메서드 이름과 인수 식의 유형을 사용하여 액세스 가능하고 적용할 수 있는 메서드, 즉 지정된 인수에서 올바르게 호출할 수 있는 선언을 찾습니다.
이러한 방법이 둘 이상 있을 수 있으며 이 경우 가장 구체적인 방법이 선택됩니다. 가장 구체적인 메소드의 디스크립터(서명 + 리턴 유형)는 메소드 디스패치를 수행하기 위해 런타임에 사용되는 디스크립터입니다.
이 경우 char[]
입니다 보다 구체적인 보다 Object
의 명시 적 캐스트가 때를 호출 그렇게 null
하지 않습니다.
이미 답변을 수락했지만 질문에 정확한 답변을 추가하고 싶습니다. 왜냐하면 두 답변은 내가 걸었던 함정을 설명하는 데 집중하기 때문입니다.
(Object)null
and 의 차이점 null
은 첫 번째 유형은 강제로 수행 Object
되지만 두 번째 유형은 생각할 수 있는 것처럼 강제되지 않는다는 것 Object
입니다. 대신 객체 대신 배열이 될 수도 있습니다.
따라서 결론은 다음과 같습니다 . 배열에서 작동하는 다른 메소드 대신 객체에서 작동하는 메소드를 정확히 얻으려면 메소드에 인수 (Object)null
대신 전달 null
하십시오.
ReferenceURL : https://stackoverflow.com/questions/19317083/what-is-the-difference-between-objectnull-and-null-in-java
'IT이야기' 카테고리의 다른 글
r에서 "행 이름"열의 이름 지정 (0) | 2021.10.11 |
---|---|
try-catch 내에서 무한 재귀의 혼란스러운 출력 (0) | 2021.10.11 |
Windows를 사용하여 한 PC에서 다른 PC로 Sublime Text 3의 설정을 어떻게 내보내거나 가져올 수 있습니까? (0) | 2021.10.11 |
"객체를 찾을 수 없음"을 의미하는 표준 Java 예외 클래스 (0) | 2021.10.10 |
AWS Lambda: 외부 API에 비밀을 저장하는 방법 (0) | 2021.10.10 |