IT이야기

Java에서 "(Object) null"과 "null"의 차이점

cyworld 2021. 10. 11. 17:40
반응형

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));
  }
}

첫 번째 printlnnull쓰지만 두 번째는 NullPointerException.

두 번째 줄만 예외로 인정되는 이유는 무엇입니까? 그리고 두 nulls 의 차이점은 무엇 입니까? Java 에는 진짜 null가짜 null 가 있습니까?


첫 번째 호출은 호출 String.valueOf(Object)명시 적으로 typecasted 것처럼, 방법 nullObject대한 참조입니다. 반대로 두 번째 String.valueOf(char[])메서드 인수 char[]보다 더 구체적이므로 오버로드된 메서드 를 호출합니다 .Objectnull

기본 매개변수를 허용하는 이 메소드의 다른 오버로드된 버전이 있지만 이는 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.valueOfJava 에는 오버로드된 메소드 가 많이 있습니다 . 또한 Java null에는 모든 유형이 있으므로 기본이 아닌 모든 것이 null.

그래서, 때 전화 (String.valueOf((Object)null)하면 전화 valueOf걸리는 방법을 Object명시 적으로 캐스팅 사용로 null로를 Object.

두 번째 예에서는 명시적으로 null특정 유형 으로 캐스팅하지 않으므로 실제로 NPE를 throw하는 valueOf메서드 를 호출합니다 char[].

로부터 JLS §15.12.2

두 번째 단계는 이전 단계에서 결정된 유형에서 멤버 메소드를 검색합니다. 이 단계에서는 메서드 이름과 인수 식의 유형을 사용하여 액세스 가능하고 적용할 수 있는 메서드, 즉 지정된 인수에서 올바르게 호출할 수 있는 선언을 찾습니다.

이러한 방법이 둘 이상 있을 수 있으며 이 경우 가장 구체적인 방법이 선택됩니다. 가장 구체적인 메소드의 디스크립터(서명 + 리턴 유형)는 메소드 디스패치를 ​​수행하기 위해 런타임에 사용되는 디스크립터입니다.

이 경우 char[]입니다 보다 구체적인 보다 Object의 명시 적 캐스트가 때를 호출 그렇게 null하지 않습니다.


이미 답변을 수락했지만 질문에 정확한 답변을 추가하고 싶습니다. 왜냐하면 두 답변은 내가 걸었던 함정을 설명하는 데 집중하기 때문입니다.

(Object)nulland 의 차이점 null은 첫 번째 유형은 강제로 수행 Object되지만 두 번째 유형은 생각할 수 있는 것처럼 강제되지 않는다는 것 Object입니다. 대신 객체 대신 배열이 될 수도 있습니다.

따라서 결론은 다음과 같습니다 . 배열에서 작동하는 다른 메소드 대신 객체에서 작동하는 메소드를 정확히 얻으려면 메소드에 인수 (Object)null대신 전달 null하십시오.

ReferenceURL : https://stackoverflow.com/questions/19317083/what-is-the-difference-between-objectnull-and-null-in-java

반응형