programing

int num = Integer.get이 되는 이유정수("123") 던지기 Null Pointer예외?

prostudy 2022. 9. 12. 10:33
반응형

int num = Integer.get이 되는 이유정수("123") 던지기 Null Pointer예외?

다음 코드가 느려집니다.NullPointerException:

int num = Integer.getInteger("123");

컴파일러가 기동하고 있습니까?getInteger정적이니 무효가 되는 건가요?말도 안 돼!

무슨 일입니까?

큰 그림

여기에는 다음 두 가지 문제가 있습니다.

  • Integer getInteger(String)생각대로 되지 않는다
    • 다시 돌아오다null이 경우에는
  • 로부터의 임무Integer로.int자동 언박스를 발생시키다
    • 그 이후로는Integernull,NullPointerException던져졌다

해석하다(String) "123"로.(int) 123, 예를 들어 를 사용할 수 있습니다. int Integer.parseInt(String).

레퍼런스

IntegerAPI 참조


Integer.getInteger

이 방법의 기능에 대해서는, 다음과 같이 설명하겠습니다.

: 지정한 이름의 시스템속성의 정수값을 결정합니다public static Integer getInteger(String nm).지정된 이름의 속성이 없는 경우 지정된 이름이 비어 있거나null속성에 올바른 숫자 형식이 없는 경우,null이 반환됩니다.

즉, 이 메서드는 의 해석과는 관계가 없습니다.String에 대해서int/Integer그보다는 방법과 관련이 있습니다.

분명히 이것은 꽤 놀랄 수 있다.라이브러리에서 이와 같은 놀라운 결과가 나온 것은 유감스럽지만, 이 라이브러리에서 중요한 교훈을 얻을 수 있습니다.그것은, 항상 메뉴얼을 참조해, 메서드의 기능을 확인하는 것입니다.

공교롭게도 이 문제의 변형은 Return of the Puzzlers: Schlock and Awe (TS-5186), Josh Bloch와 Neal Gafter의 2009 JavaOne Technical Session 프레젠테이션에서 다루어졌습니다.마지막 슬라이드는 다음과 같습니다.

모럴

  • 이상하고 끔찍한 방법들이 도서관에 도사리고 있다.
    • 어떤 사람들은 악의 없는 소리 이름을 가지고 있다.
  • 코드가 올바르지 않은 경우
    • 올바른 메서드를 호출하고 있는지 확인합니다.
    • 라이브러리의 메뉴얼을 읽다
  • API 설계자용
    • 놀람이 적다는 원칙을 어기지 마라.
    • 추상화 계층을 위반하지 않음
    • 전혀 다른 행동에 대해 유사한 이름을 사용하지 마십시오.

완전성을 위해 다음과 같은 방법도 있다.Integer.getInteger:

관련 질문


자동 박스 시

또 다른 문제는, 물론, 어떻게 하면NullPointerException던져집니다.이 문제에 초점을 맞추기 위해 다음과 같이 스니펫을 간략화할 수 있습니다.

Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!

다음은 Effective Java 2nd Edition, Item 49: 박스형 프리미티브보다 원시형 선호:

요약하면, 프리미티브는 필요에 따라서 박스로 둘러싸인 프리미티브를 사용해 주세요.원시 유형은 더 간단하고 빠릅니다.상자형 프리미티브를 사용해야 하는 경우 주의하십시오!오토박스는 박스형 프리미티브를 사용하는 경우의 장황함을 줄여주지만 위험은 줄여주지 않습니다.이 2개의 와 2개의 박스형 프리미티브를 ==연산자, 이것은 신원 비교를 하지만, 거의 확실히 당신이 원하는 것은 아니다.가 없는을 수행할 하고, 박스를 를 해제할 수 .NullPointerException마지막으로 프로그램이 원시 값을 박스화하면 비용이 많이 들고 불필요한 오브젝트 작성으로 이어질 수 있습니다.

상자형 프리미티브(예: 제네릭)를 사용할 수밖에 없는 곳이 있지만, 그렇지 않은 경우 상자형 프리미티브를 사용하는 결정이 정당한지 심각하게 고려해야 합니다.

관련 질문

http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html 에서 :

getInteger '지정된 이름으로 시스템 속성의 정수 값을 결정합니다.'

원하는 것은 다음과 같습니다.

Integer.parseInt("123")

메서드 get 문서를 확인하십시오.정수().이 방법에서는Stringparameter는 지정된 이름의 시스템속성의 정수값을 결정하는 시스템 속성입니다.여기서 설명한 바와 같이 "123"은 시스템속성의 이름이 아닙니다.이 문자열을 변환하는 경우intint num = Integer.parseInt("123").

언급URL : https://stackoverflow.com/questions/3123349/why-does-int-num-integer-getinteger123-throw-nullpointerexception

반응형