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)에 할당하거나 캐스트 할 수 있습니다.
답변
다른 사람들이 작성한 것처럼 모든 것에 널을 던질 수 있습니다. 일반적으로 필요하지 않을 것입니다.
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 유형의 인수를 하나만 가져야한다는 것을 알 수 있습니다.