[java] java에서 null로 타입 캐스팅하는 동안 예외가 없습니다.

String x = (String) null;

이 진술에 예외가없는 이유는 무엇입니까?

String x = null;
System.out.println(x);

인쇄합니다 null. 그러나 .toString()메소드는 널 포인터 예외를 발생시켜야합니다.



답변

당신은 캐스팅 할 수 있습니다 null예외없이 모든 참조 유형으로 할 .

println메서드는 먼저 개체가 null인지 여부를 확인하므로 null 포인터를 throw하지 않습니다. null의 경우는 단순히 캐릭터 라인을 인쇄합니다 "null". 그렇지 않으면 toString해당 객체 의 메소드를 호출 합니다.

세부 사항 추가 : 내부적으로 인쇄 메소드 String.valueOf(object)는 입력 오브젝트에서 메소드를 호출 합니다. 그리고 valueOf메소드 에서이 검사는 null 포인터 예외를 피하는 데 도움이됩니다.

return (obj == null) ? "null" : obj.toString();

혼동을 피하기 위해 특별한 경우가 아니라면 null 객체에서 메소드를 호출하면 null 포인터 예외가 발생합니다.


답변

null모든 참조 유형으로 캐스트 할 수 있습니다 . null예를 들어 인수 를 처리하는 메소드를 호출 할 수도 System.out.println(Object)있지만null 값을 하고 메소드를 호출 .

BTW null값에 정적 메소드를 호출 할 수있는 까다로운 상황이 있습니다 .

Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.


답변

이것은 의도적으로 설계된 동작입니다. null모든 참조 유형으로 캐스트 할 수 있습니다 . 그렇지 않으면 참조 변수에 할당 할 수 없습니다.


답변

메소드가 오버로드되는 구문을 따르는 데 널 값을 캐스트해야하며 널이 이러한 오버로드 된 메소드에 전달되면 컴파일러는 모호성을 정리하는 방법을 모르므로 다음과 같은 경우 널을 캐스트해야합니다.

class A {
  public void foo(Long l) {
    // do something with l
  }
  public void foo(String s) {
    // do something with s      
  }
}
new A().foo((String)null);
new A().foo((Long)null);

그렇지 않으면 필요한 메소드를 호출 할 수 없습니다.


답변

Println(Object) 사용 String.valueOf()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Print(String) null 확인을 수행합니다.

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}


답변

여기에 많은 답변이 이미 언급되어 있습니다.

모든 참조 유형에 null을 캐스트 할 수 있습니다.

인수가 널이면 “null”과 같은 문자열

나는 그것이 어디에 지정되어 있는지 궁금해하고 그것을 Java Specification을 찾아 보았다.

null 참조는 항상 모든 참조 유형 (§5.2, §5.3, §5.5)에 할당하거나 캐스트 할 수 있습니다.

참조가 널이면 문자열 “null”(4 개의 ASCII 문자 n, u, l, l)로 변환됩니다.


답변

다른 사람들이 작성한 것처럼 모든 것에 널을 던질 수 있습니다. 일반적으로 필요하지 않을 것입니다.

String nullString = null;

거기에 캐스트를 넣지 않고.

그러나 그러한 캐스트가 이해되는 경우가 있습니다.

a) 특정 메소드가 호출되도록하려면 다음과 같이하십시오.

void foo(String bar) {  ... }
void foo(Object bar) {  ... }

입력하면 차이가납니다

foo((String) null) vs. foo(null)

b) IDE를 사용하여 코드를 생성하려는 경우 예를 들어 나는 일반적으로 다음과 같은 단위 테스트를 작성하고 있습니다.

@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
    new MyClassUnderTest((Whatever) null);
}

나는 TDD를하고있다; 이것은 “MyClassUnderTest”클래스가 아직 존재하지 않음을 의미합니다. 해당 코드를 작성하여 IDE를 사용하여 먼저 새 클래스를 생성 할 수 있습니다. 그리고 “What out”인수 “out of the box”를 받아들이는 생성자를 생성하려면 IDE는 테스트에서 생성자가 정확히 Whatever 유형의 인수를 하나만 가져야한다는 것을 알 수 있습니다.