2009-04-30 2 views
2

При написании игры для J2ME мы столкнулись с проблемой, используя java.lang.Integer.parseInt()Является ли J2ME Integer.parseInt() сломанным?

У нас есть несколько постоянных значений, определенных как шестнадцатеричные значения, например:

CHARACTER_RED = 0xFFAAA005; 

Во время игры значение сериализуется и принимается через сетевое соединение, входящее в виде строкового представления шестнадцатеричного значения. Для того, чтобы разобрать его обратно к междунар мы безуспешно пытались следующее:

// 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? В конце концов, мне пришлось написать собственную функцию разбора шестнадцатеричной строки, и я был совершенно недоволен предоставленной реализацией.

Другими словами, было ли мое ожидание того, что Integer.parseInt() работает с шестнадцатеричным представлением целого числа с ошибками?

EDIT: В моей первоначальной публикации я написал 0xFFFAAA005 вместо 0xFFAAA005. С тех пор я исправил эту ошибку.

+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. Я предполагаю, что он жалуется, потому что вы попросили его проанализировать число, которое больше, чем тип данных результата.

+0

Спасибо, исправил его в вопросе. Фактическое значение кода - 0xFFAAA005, а не 0xFFFAAA005, которое я изначально перечислял в вопросе. –

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 (). Кроме того, строка не выглядит синтаксической, если у вас есть 0x в вашей строке, поэтому попробуйте отключить ее.

+0

Спасибо. С тех пор я исправил это, проблему написания вещей из памяти вместо того, чтобы смотреть на фактический код. –

Смежные вопросы