source

java에서 null이 있는 형식 캐스팅 중 예외가 없습니다.

goodcode 2022. 8. 17. 23:46
반응형

java에서 null이 있는 형식 캐스팅 중 예외가 없습니다.

String x = (String) null;

왜 이 성명에는 예외가 없는가?

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

null.toString()

은 할 수 있어요.null예외 없이 모든 참조 유형으로 이동합니다.

println메서드는 먼저 개체가 null인지 여부를 확인하기 때문에 null 포인터를 던지지 않습니다. null을 만 하면 ."null" 를호 the the the the the the the라고 합니다.toString메서드를 지정합니다.

상세 추가:내부적으로 인쇄 메서드 호출String.valueOf(object)메서드를 지정합니다. ★★★★★★★★★★★★★★★.valueOf늘의 예외를 데 도움이 됩니다.이 는, 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 「null」의 예외에 도움이 됩니다

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

나머지 혼란은 늘 객체의 메서드를 호출하면 특별한 경우가 아니라면 늘 포인터 예외가 발생합니다.

은 할 수 있어요.null모든 참조 유형에 적용됩니다., 이 때, 이 때 사용하는 도 있습니다.null 인수로 할 수 있습니다.System.out.println(Object) 이 경우에는 '아, 아, 아, 아, 이 경우 할 수 .null값을 지정하고 메서드를 호출합니다.

할 수 있는 처럼 보이는 이 있습니다.null★★★★★★ 。

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

이치노은 할 수 있어요.null모든 참조 유형에 적용됩니다.그렇지 않으면 기준 변수에 할당할 수 없습니다.

메서드가 오버로드된 경우 다음 구성에서는 null 값을 캐스팅해야 합니다.이러한 메서드에 null이 전달되면 컴파일러는 모호성을 해소하는 방법을 모르기 때문에 이 경우 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)을 사용하다

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

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

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

그리고.

인수가 null인 경우 "null"과 동일한 문자열

어디에 명시되어 있는지 궁금해서 Java Specification을 찾아봤습니다.

늘 참조는 항상 모든 참조 유형(55.2, 55.3, 55.5)에 할당하거나 캐스트할 수 있습니다.

참조가 null인 경우 문자열 "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를 사용하여 먼저 새로운 클래스를 생성하고 다음으로 "즉시 사용 가능한" 인수를 받아들이는 컨스트럭터를 생성할 수 있습니다.IDE는 테스트에서 컨스트럭터가 "무엇이든" 유형의 인수를 하나만 사용해야 한다는 것을 알 수 있습니다.

이 언어 기능은 이 상황에서 편리합니다.

public String getName() {
  return (String) memberHashMap.get("Name");
}

memberHashMap.get("Name")이 null을 반환해도 위의 메서드는 예외 없이 null을 반환해야 합니다.클래스가 무엇이든 null은 null입니다.

인쇄:

개체를 인쇄합니다.String.valueOf(Object) 메서드로 생성된 문자열은 바이트로 변환됩니다.

가치:

인수가 null이면 "null"과 같은 문자열이 반환됩니다.그렇지 않으면 obj.toString() 값이 반환됩니다.

오브젝트가 다음과 같은 경우 단순히 값 "null"을 가진 문자열을 반환합니다.null.

이것은 애매한 방법을 사용할 때 매우 편리합니다.예를 들어 JDialog에는 다음과 같은 시그니처를 가진 컨스트럭터가 있습니다.

JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)

Graphics Configuration을 설정하고 싶은데 이 대화상자의 부모가 없기 때문에 이 컨스트럭터를 사용해야 합니다.첫 번째 인수는 null이어야 합니다.사용.

JDialog(null, String, boolean, Graphicsconfiguration) 

는 애매하기 때문에, 이 경우는, null을 서포트되고 있는 타입의 어느 쪽인가에 캐스팅 하는 것으로써, 콜을 좁힐 수 있습니다.

JDialog((Frame) null, String, boolean, GraphicsConfiguration)

언급URL : https://stackoverflow.com/questions/18723596/no-exception-while-type-casting-with-a-null-in-java

반응형