답변:
당신은 캐스팅 할 수 있습니다 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.
t.yield() -> Thread.yeld()
어쨌든 "최적화"하기 때문에 그렇지 않습니까? 방법과 유사 final int i = 1; while (i == 1)
에 최적화되어 있습니다while(true)
메소드가 오버로드되는 구문을 따르는 데 널 값을 캐스트해야하며 널이 이러한 오버로드 된 메소드에 전달되면 컴파일러는 모호성을 정리하는 방법을 모르므로 다음과 같은 경우 널을 캐스트해야합니다.
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);
그렇지 않으면 필요한 메소드를 호출 할 수 없습니다.
String bar = null;
캐스팅합니다 . 지금까지 메서드가 오버로드 된 테스트에서 null을 명시 적으로 캐스팅해야했으며 null 입력으로 동작을 테스트하고 싶었습니다. 아직도, 나는 당신을 발견하기 전에 비슷한 대답을 쓰려고했습니다. null
String
l instanceof Long
및 s instanceof String
반환 false
이러한 경우.
여기에 많은 답변이 이미 언급되어 있습니다.
모든 참조 유형에 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 유형의 인수를 하나만 가져야한다는 것을 알 수 있습니다.
모호한 방법을 사용할 때 매우 유용합니다. 예를 들어, JDialog에는 다음과 같은 서명을 가진 생성자가 있습니다.
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
GraphicsConfiguration을 설정하고 싶기 때문에이 생성자를 사용해야하지만이 대화 상자의 부모가 없으므로 첫 번째 인수는 null이어야합니다. 사용
JDialog(null, String, boolean, Graphicsconfiguration)
모호 하므로이 경우 지원되는 유형 중 하나로 null을 캐스팅하여 호출 범위를 좁힐 수 있습니다.
JDialog((Frame) null, String, boolean, GraphicsConfiguration)