Android Java - 解析“76”时出现 NumberFormatException

Android Java - NumberFormatException while parsing "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.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:无效整数:“ 76” 我不明白为什么它不起作用!

在 Android 4.1.2 上测试过,但它似乎也不适用于 4.4.2。

提前感谢任何希望解决这个问题的人。

将整个字符串复制到 Eclipse 中进行测试后,我可以重现这个问题。我在TextPad中打开"binary mode"中的源码,看字符串中有没有一些奇怪的字符,果然有。

22 EF BB BF 37 36 22     "???76"

我用谷歌搜索了字符串 "EFBBBF",发现字节序列是 the Unicode "byte order mark"

When this BOM character, U+FEFF, is serialized in UTF-8 encoding, it becomes an octet sequence of EF BB BF (\xEFBBBF).

果然,当我的光标位于第一个双引号和 7 之间时,我点击了删除,没有字符消失。 (第二次删除删除了双引号,所以我把它放回去了。)之后,Integer.parseInt 能够找到整数 76

如果该字符出现在您的字符串中,您需要调整您的程序以考虑该字符。