Не работает Integer.parseInt() в J2ME?
Вопрос
При написании игры для J2ME мы столкнулись с проблемой при использовании java.lang.Integer.parseInt().
У нас есть несколько постоянных значений, определенных как шестнадцатеричные значения, например:
CHARACTER_RED = 0xFFAAA005;
Во время игры значение сериализуется и принимается через сетевое соединение в виде строкового представления шестнадцатеричного значения.Чтобы проанализировать его обратно в int, мы безуспешно попробовали следующее:
// 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() будет работать с представлением целого числа в виде шестнадцатеричной строки, было ошибочным?
РЕДАКТИРОВАТЬ:В своем первоначальном сообщении я написал 0xFFFAAA005 вместо 0xFFAAA005.С тех пор я исправил эту ошибку.
Решение
А String
который вы анализируете, слишком велик, чтобы поместиться в int
.На Яве int
— это знаковый 32-битный тип данных.Ваша строка требует не менее 36 бит.
Ваше (положительное) значение все еще слишком велико, чтобы вписаться в подписано 32-битный int
.
Другие советы
Помните, что ваш ввод (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);
}
}
Я не разработчик Java, но предполагаю, что parseInt работает только с целыми числами.0xFFFAAA005 имеет 9 шестнадцатеричных цифр, поэтому это длинное, а не целое число.Я предполагаю, что он жалуется, потому что вы попросили его проанализировать число, которое больше, чем тип данных результата.
Ваше число кажется слишком большим, чтобы поместиться в целое число, попробуйте вместо этого использовать Long.parseLong().Кроме того, строка, похоже, не анализируется, если в ней есть 0x, поэтому попробуйте отрезать ее.