int num = Integer.get이 되는 이유정수("123") 던지기 Null Pointer예외?
다음 코드가 느려집니다.NullPointerException
:
int num = Integer.getInteger("123");
컴파일러가 기동하고 있습니까?getInteger
정적이니 무효가 되는 건가요?말도 안 돼!
무슨 일입니까?
큰 그림
여기에는 다음 두 가지 문제가 있습니다.
Integer getInteger(String)
생각대로 되지 않는다- 다시 돌아오다
null
이 경우에는
- 다시 돌아오다
- 로부터의 임무
Integer
로.int
자동 언박스를 발생시키다- 그 이후로는
Integer
이null
,NullPointerException
던져졌다
- 그 이후로는
해석하다(String) "123"
로.(int) 123
, 예를 들어 를 사용할 수 있습니다. int Integer.parseInt(String)
.
레퍼런스
Integer
API 참조
온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
마지막으로 프로그램이 원시 값을 박스화하면 비용이 많이 들고 불필요한 오브젝트 작성으로 이어질 수 있습니다.
상자형 프리미티브(예: 제네릭)를 사용할 수밖에 없는 곳이 있지만, 그렇지 않은 경우 상자형 프리미티브를 사용하는 결정이 정당한지 심각하게 고려해야 합니다.
관련 질문
- Java/C#의 int와 integer의 차이점은 무엇입니까?
- Java의 자동 박스를 사용하면 부울에 대해 3개의 값을 지정할 수 있는 이유는 무엇입니까?
- Java에서 새로운 Integer(i) == i가 보장됩니까? (YES!!)
- Java에서 두 정수 비교 시 자동 언박스가 발생합니까? (NO!!!)
- Java noob: 오브젝트 상에서만 범용?(아쉽지만)
http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html 에서 :
getInteger '지정된 이름으로 시스템 속성의 정수 값을 결정합니다.'
원하는 것은 다음과 같습니다.
Integer.parseInt("123")
메서드 get 문서를 확인하십시오.정수().이 방법에서는String
parameter는 지정된 이름의 시스템속성의 정수값을 결정하는 시스템 속성입니다.여기서 설명한 바와 같이 "123"은 시스템속성의 이름이 아닙니다.이 문자열을 변환하는 경우int
이 int num = Integer.parseInt("123")
.
언급URL : https://stackoverflow.com/questions/3123349/why-does-int-num-integer-getinteger123-throw-nullpointerexception
'programing' 카테고리의 다른 글
POST 요청 %5B 및 %5D는 무엇을 나타냅니까? (0) | 2022.09.12 |
---|---|
_(언더스코어)는 예약된 키워드입니다. (0) | 2022.09.12 |
원칙의 기본값 (0) | 2022.09.12 |
mysql에서 그룹 이름 전 날짜 및 시간별로 주문 (0) | 2022.09.11 |
python: 변수가 배열인지 스칼라인지 식별하는 방법 (0) | 2022.09.11 |