我正在开发一个使用 zbar 来解码 QR 的 Android 应用程序。 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:无效的整数:“76” 我不明白为什么它不起作用!
在 Android 4.1.2 上测试,但似乎在 4.4.2 上也不起作用。
提前感谢所有希望解决这个问题的人。
最佳答案
将整个字符串复制到 Eclipse 中进行测试后,我可以重复此问题。我在TextPad中以“二进制模式”打开源代码,看看字符串中是否有一些奇怪的字符,果然有。
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
。
如果该字符出现在字符串中,您需要调整程序以考虑该字符。
关于java - Android Java - 解析 "76"时出现 NumberFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040070/