整数解析Java中的Bug?

时间:2016-09-30 00:38:13

标签: java string parsing integer

我一直在努力处理我的代码“行为”在过去两个小时里真的很奇怪。

我正在使用LibGdx进行项目。

我想做什么?

我读取了一个文本文件,并从文件的行中创建了一个String数组。 现在我想取一行,在其中替换一个关键字并将剩余的String解析为整数。

String[] lines = data.split(System.getProperty("line.separator"));    
int moves = Integer.parseInt(lines[11].replace("POSITION", ""));

但每当我尝试在Android上运行该程序时,它就会崩溃,只是说致命异常。

奇怪的是,看似相同的代码有效。

int moves = (int) Float.parseFloat(lines[11].replace("POSITION", ""));
int moves = Integer.parseInt(lines[11].replace("POSITION", "").substring(0, 1));

这两项工作都没有问题......

但为什么第一个(也是最直接的)代码不起作用?

第[11]行只持有“POSITION5”

这是我在LogCat中遇到的整个错误:

09-30 11:12:31.815 19016-19088/com.jradventure.game E/AndroidRuntime: FATAL EXCEPTION: GLThread 1154
                                                                      Process: 
com.jradventure.game, PID: 19016
                                                                              at java.lang.Integer.invalidInt(Integer.java:138)
                                                                              at java.lang.Integer.parse(Integer.java:410)
                                                                              at java.lang.Integer.parseInt(Integer.java:367)
                                                                              at java.lang.Integer.parseInt(Integer.java:334)
                                                                              at com.jradventure.game.Helper.LevelLoader.run(LevelLoader.java:98)
                                                                              at com.jradventure.game.Screens.LevelScreen.setupStage(LevelScreen.java:170)
                                                                              at com.jradventure.game.Screens.LevelScreen.<init>(LevelScreen.java:72)
                                                                              at com.jradventure.game.Screens.LevelSelectionScreen$1.run(LevelSelectionScreen.java:77)
                                                                              at com.jradventure.game.UIElements.SelectionButton$1.touchUp(SelectionButton.java:57)

这让我疯了!请解释一下!

2 个答案:

答案 0 :(得分:0)

嗯。你写道:

line[11] only holds "POSITION5"

您编码:

Integer.parseInt(lines[11].replace("POSITION", "").substring(0, 10))
  1. 这会删除"POSITION"
  2. 此时字符串现在包含5
  3. 然后,您将获取由前九个字符组成的子字符串。但是字符串中只有一个字符。如果这不会引发StringIndexOutOfBoundsException,我会非常惊讶。
  4. 与整数解析无关。

    删除.substring(...)部分或.replace(...)

答案 1 :(得分:0)

所以我认为我找到了解决问题的方法。

我遇到了与从文本文档加载的数据更奇怪的交互。我正在使用

String data = Gdx.files.internal(path).readString();

阅读文本文件。

我用缓冲的阅读器替换它,一切正常......

InputStream is = Gdx.files.internal(path).read();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line = in.readLine();

也许readString方法做了一些抛出android的格式化,我不知道。

感谢您的帮助!