2009-04-30 4 views
2

우리는 java.lang.Integer.parseInt를 사용하여 문제로 실행()J2ME의 Integer.parseInt()가 손상 되었습니까? J2ME를위한 게임을 쓰는 동안

우리는 예를 들어, 16 진수 값으로 정의 된 몇 가지 상수 값을 가지고 게임을하는 동안

CHARACTER_RED = 0xFFAAA005; 

값은 직렬화되고 네트워크 연결을 통해 수신되며 16 진수 값의 문자열 표현으로 들어옵니다. int로 다시 그것을 분석하기 위해 우리는 unsuccesfully 시도 다음

// Response contains the value "ffAAA005" for "characterId" 
string hexValue = response.get("characterId"); 
// The following throws a NumberFormatException 
int value = Integer.parseInt(hexValue, 16); 

은 그 때 나는 몇 가지 테스트를 실행하고이 시도 :

: 이것은 실제 코드에서 예외가

string hexValue = Integer.toHexString(0xFFAAA005); 
// The following throws a NumberFormatException 
int value = Integer.parseInt(hexValue, 16); 

입니다

java.lang.NumberFormatException: ffaaa005 
    at java.lang.Integer.parseInt(Integer.java:462) 
    at net.triadgames.acertijo.GameMIDlet.startMIDlet(GameMIDlet.java:109) 

나는 인정해야한다. 나를 당황하게했다. parseInt 코드를 살펴보면 숫자가 "음수/양수 경계"를 넘어 "교차"할 때 (아마도 누군가 올바른 용어로 편집 할 수 있습니까?) NumberFormatException이 던져진 것 같습니다.

Integer.parseInt 함수의 예상되는 동작입니까? 결국 필자는 자체의 16 진 문자열 파싱 함수를 작성해야했으며 제공된 구현에 상당히 불만을 표시했습니다.

다른 말로하면 Integer.parseInt()가 정수의 16 진수 문자열 표현에 대해 잘못된 생각이 들었습니까?

편집 : 처음 게시 할 때 0xFFAAA005 대신 0xFFFAAA005를 썼습니다. 나는 그 실수를 바로 잡았습니다.

+0

널리 사용되는 도구에 근본적인 버그가 있다고 가정하는 것은 바람직하지 않습니다. 당신이 그것을 생각하고 유혹을받을 때마다, 당신은 모든 일을 올바르게하고 있음을 두 배와 세 번 점검해야합니다. –

+0

나는 downvotes을 정말로 얻지 않는다. 그것은 잘 쓰여진 질문이었습니다. –

+0

+1 이유가 확실하지 않은 이유는 확실합니다. 합법적 인 질문입니다. –

답변

6

구문 분석하려는 String이 너무 커서 int에 맞지 않습니다. Java에서 int은 부호가있는 32 비트 데이터 유형입니다. 문자열에 최소 36 비트가 필요합니다.


당신의 (양의) 값은 여전히 ​​ 에 맞게 너무 커서 32 비트 int을 체결했다.

+0

내 실수로 질문을 작성할 때 코드에서 사용하는 값인 0xFFaaa005와 함께 문제가 발생합니다. –

+1

http://bugs.sun.com/view_bug.do?bug_id=4068580 – kdgregory

+0

"음수 값을 구문 분석하면 작동합니다 :"-FFAAA005 "", 아니 작동하지 않습니다. 그것은 또한 부호가있는 32 비트 int에 대해 오버플로됩니다. –

1

저는 java 개발자가 아니지만 parseInt는 정수에서만 작동합니다. 0xFFFAAA005는 9 진수 숫자를 가지므로 int가 아닌 long입니다. 내 생각 엔 결과 데이터 형식보다 더 큰 숫자를 구문 분석하도록 요청했기 때문에 불평을하는 것 같습니다.

+0

감사합니다. 문제가 해결되었습니다. 실제 코드 값은 원래 질문에 나열된 0xFFFAAA005가 아닌 0xFFAAA005입니다. –

4

입력 한 내용 (4289372165)이 int (2147483647)의 최대 크기를 오버플로합니다.

long로 값을 구문 분석을 시도하고 당신이 그것을 구문 분석하기 전에 문자열 떨어져 선두 "0x" 트림 :

public class Program { 
    public static void main(String[] args) { 
     String input = "0xFFFAAA005"; 
     long value = Long.parseLong(input.substring(2), 16); 
     System.out.print(value); 
    } 
} 
+0

수정 된 버전을 확인하십시오. 질문의 원래 게시 실수를 지적 주셔서 감사합니다. –

+0

입력 한 내용 (수정 된 후에도)은 여전히 ​​int에 비해 너무 큽니다. –

0

귀하의 수는, Long.parseLong를 사용하려고하는 int에 맞게 너무 큰 것 같다 () 대신. 또한 문자열에 0x가있는 경우 문자열이 구문 분석되지 않는 것 같습니다. 따라서이를 잘라보십시오.

+0

감사합니다. 나는 그 이후로 실제 코드를 보는 대신 메모리에서 물건을 쓰는 문제를 바로 잡았다. –

관련 문제