Android Java - NumberFormatException при разборе "76"
Я работаю над приложением Android, используя zbar для декодирования QR. Структура QR-кода: "SpecificPrefix /[Number]".
String d = sym.getData(); // I get the QR text from the symbol
if(d.startsWith(QRUri)) { // QRUri is a string const containig the prefix
int id;
try {
Log.d("NOT", "QR Subst \"" + d.substring(QRUri.length()) + "\""); // Print the data after the Prefix
id = Integer.parseInt(d.substring(QRUri.length())); // Try to parse it to int
} catch(NumberFormatException e) {
e.printStackTrace();
id = 0;
}
}
Этот код до сих пор работал для каждого QR, но сегодня я обнаружил, что для "SpecificPrefix/76" это не так.
Это журнал:
D/NOT﹕ QR Subst "76"
D/NOT﹕ No Int found!
W/System.err﹕ java.lang.NumberFormatException: Invalid int: "76"
W/System.err﹕ at java.lang.Integer.invalidInt(Integer.java:138)
W/System.err﹕ at java.lang.Integer.parse(Integer.java:375)
W/System.err﹕ at java.lang.Integer.parseInt(Integer.java:366)
W/System.err﹕ at java.lang.Integer.parseInt(Integer.java:332)
W/System.err﹕ at [...].MainActivity$3.onPreviewFrame(MainActivity.java:146)
W/System.err﹕ at android.hardware.Camera$EventHandler.handleMessage(Camera.java:841)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4921)
W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
java.lang.NumberFormatException: недопустимый int: "76" Я не могу понять, почему это не работает!
Протестировано на Android 4.1.2, но, похоже, на 4.4.2 тоже не работает.
Заранее спасибо всем, кто надеется решить это.
1 ответ
После копирования всей строки в Eclipse, чтобы проверить это, я могу продублировать эту проблему. Я открыл исходный код в "двоичном режиме" в TextPad, чтобы увидеть, есть ли в строке какие-то странные символы, и, конечно же, есть.
22 EF BB BF 37 36 22 "???76"
Я погуглил строку "EFBBBF" и обнаружил, что последовательность байтов - это Unicode "метка порядка следования байтов ".
Когда этот символ спецификации, U+FEFF, сериализуется в кодировке UTF-8, он становится последовательностью октетов EF BB BF (\xEFBBBF).
Конечно же, я нажал "Удалить", когда мой курсор был между первой двойной кавычкой и 7, и ни один символ не исчез. (Второе удаление удалило двойную кавычку, поэтому я положил ее обратно.) После этого Integer.parseInt
удалось найти целое число 76
,
Вам нужно будет настроить свою программу так, чтобы она учитывала этот символ, если он появляется в ваших строках.