String.valueOf(null)가 NullPointer를 슬로우하는 이유예외?
설명서에 따르면 메서드는 다음을 반환합니다.
null
에 에 하는 문자열입니다."null"
그 이외의 , 의 값; " " " " " 입니다.obj.toString()
이 반환됩니다.
하지만 내가 이걸 하려고 하면 왜?
System.out.println("String.valueOf(null) = " + String.valueOf(null));
대신 NPE를 던질까요?(믿을 수 없다면 직접 시도해 보세요!)
스레드 "main" java.lang에 예외가 있습니다.특수한 포인터예외.를 참조해 주세요.문자열(알 수 없는 소스)를 참조해 주세요.String.valueOf(알 수 없는 소스)
어떻게 이런 일이 일어날 수 있죠?그 서류는 나에게 거짓말입니까?Java의 주요 버그입니까?
는 문는 the the the the the theString.valueOf
메서드가 오버로드되었습니다.
Java Specification Language는 이러한 경우 가장 구체적인 과부하를 선택하도록 요구합니다.
JLS 15.12.2.5 가장 구체적인 방법 선택
여러 멤버 메서드가 접근 가능하고 메서드 호출에 적용할 수 있는 경우 런타임 메서드 디스패치의 디스크립터를 제공할 멤버 메서드를 선택해야 합니다.Java 프로그래밍 언어에서는 가장 구체적인 메서드가 선택된다는 규칙을 사용합니다.
A char[]
Object
전부는 Object
char[]
. 러므, 。char[]
보다 구체적이다Object
"Java"는 "Java"입니다String.valueOf(char[])
이 경우 과부하가 선택됩니다.
String.valueOf(char[])
가 non-timeout이 될 하고 있습니다.null
, 그 이후부터, 「」는 「」입니다.null
이 경우에 주어진 것은, 그리고 나서 던집니다.NullPointerException
.
은 '수정'을 입니다.null
Object
음음음같 뭇매하다
System.out.println(String.valueOf((Object) null));
// prints "null"
관련 질문
이야기의 교훈
몇 가지 중요한 것이 있습니다.
- 유효한 Java 제2판, 항목 41: 적절한 오버로드 사용
- 과부하가 걸린다고 해서 매번 해야 하는 건 아니야
- 혼란을 일으킬 수 있습니다(특히 방법이 크게 다른 경우).
- 정상적인 IDE를 사용하면 컴파일 시 어떤 과부하가 선택되었는지 확인할 수 있습니다.
- Eclipse를 사용하면 위의 표현에 마우스를 움직여 실제로,
valueOf(char[])
버!로!아!
- Eclipse를 사용하면 위의 표현에 마우스를 움직여 실제로,
- 으로 캐스팅을 하고 도 있어요.
null
() (따라서 (따라서)
「 」를 참조해 주세요.
시 ★★★★★null
하는 경우는 적어도 두 가지가 있습니다.null
특정 참조 유형에 대한 설명 필요:
- 오버로드를 선택하려면(위의 예시와 같이)
- 주다
null
varararg 파라미터의 단일 인수로서
후자의 간단한 예는 다음과 같습니다.
static void vararg(Object... os) {
System.out.println(os.length);
}
그 후, 다음과 같이 할 수 있습니다.
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
「 」를 참조해 주세요.
- Java Language Guide/varargs - 구현 방법을 이해하기 위해
관련 질문
문제는 당신이 전화를 하는 것이지 전화를 하는 것이 아니라는 것입니다.
그 이유는 Java가 항상 지정된 파라미터로 동작하는 오버로드된 메서드의 가장 구체적인 버전을 선택하기 때문입니다. null
에 유효한 값입니다.Object
파라미터는 유효한 값이기도 합니다.char[]
파라미터를 지정합니다.
Java가 를 사용하도록 설정하려면Object
버전, 전달 중 하나null
변수를 사용하거나 객체에 명시적 캐스트를 지정합니다.
Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
지난 2003년 4867608이라는 버그가 접수되었는데, 이 설명으로 "수정되지 않음"으로 해결되었습니다.
호환성 제약으로 인해 변경할 수 없습니다.public static String value Of(char data []) 메서드가 호출되며 null 인수에 대한 "null" 치환에 대해서는 언급하지 않습니다.
@###.### 2003-05-23
사용하다String.valueOf(null: Any)
scala, 그렇지 않은 경우String.valueOf(null: Array[Char])
유추할 수 있습니다.마찬가지로 Java에서도 암묵적인 캐스트가 만족스럽지 않으면 명시적인 캐스트가 필요합니다.IntelliJ에서는 valueOf를 사용할 때 Ctrl+B를 누르면 사용할 수 있는 여러 valueOf 버전이 나타납니다.
언급URL : https://stackoverflow.com/questions/3131865/why-does-string-valueofnull-throw-a-nullpointerexception
'programing' 카테고리의 다른 글
mysql 날짜별 합계 그룹 선택 (0) | 2022.12.28 |
---|---|
하위 프로세스의 출력을 저장합니다.콜을 문자열로 팝업하다 (0) | 2022.12.28 |
모멘트 JS UTC에서 로컬 시간 (0) | 2022.12.28 |
VueJS 구성 요소의 이미지가 로드되지 않습니다. (0) | 2022.12.28 |
mariadb C 커넥터를 링크할 때 참조가 정의되지 않음 (0) | 2022.12.28 |