0

我最近在 google play 中发布了一个 Android 游戏,我收到了这个NumberFormatException的崩溃报告

我什至指出了它来自的代码。但最让我担心的是,在我测试过的任何设备中都没有抛出异常(我已经在许多设备上测试过)。

我有一个这样排列的字符串文件...“10.48,1.6,90.0,1.155,1.73”,其中每个浮点数用逗号分隔...我不知道为什么我的应用程序的用户会发生这种奇怪的异常:(

这是我用来从文件中解析的代码

 while(j<line.length())
        {
            if(line.charAt(j) == ',')
            {
                endingPoint = j;
                planetList[i].add(Float.valueOf(line.substring(startingPoint, endingPoint)));
                startingPoint = j+1;
            }
            else if(line.charAt(j) == 's')
            {
                i++;
                startingPoint = j+1;
            }
            j++;
        }

这是引发异常的行...

cam = new Camera(Float.valueOf(df.format(worldWidth)),fourPointEightFixer);

这是我的应用程序的善良用户发送的堆栈跟踪:

java.lang.NumberFormatException
at  org.apache.harmony.luni.util.FloatingPointParser.parseFltImpl(Native Method) 
at org.apache.harmony.luni.util.FloatingPointParser.parseFloat(FloatingPointParser.java:321) 
at java.lang.Float.parseFloat(Float.java:323) 
at java.lang.Float.valueOf(Float.java:362) 
at com.OnMyOwn.Game.WackyGravity.<init>(WackyGravity.java:97) 
at com.OnMyOwn.Game.LevelChooserMod.initiateGame(LevelChooserMod.java:550) 
at com.OnMyOwn.Game.LevelChooserMod.onButtonTouchUp(LevelChooserMod.java:576) 
at com.OnMyOwn.Game.LevelChooserMod.update(LevelChooserMod.java:384) 
at com.OnMyOwn.framework.impl.GLGame.onDrawFrame(GLGame.java:165) 
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363) 
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
4

2 回答 2

1

如果此行导致问题:

cam = new Camera(Float.valueOf(df.format(worldWidth)),fourPointEightFixer);

你应该用(假设worldWidth是浮动/双)替换它:

cam = new Camera(/*cast (float) if worldWidth is double*/worldWidth,fourPointEightFixer);

第一:无需将此值更改为字符串并再次解析,第二:我很确定df.format(double/float)可以在使用逗号将 Language/Locale 设置为 Locale 的设备上以逗号作为小数分隔符返回 double/float 的字符串表示形式作为分隔符(几乎整个非英语欧洲)

或者您可以在创建/获取实例时强制语言环境DecimalFormat

DecimalFormat df = (DecimalFormat)NumberFormat.getNumberInstance(Locale.US);

我认为 Ali 提供的快速修复(捕获异常)不是好的解决方案(因为捕获预期的异常是不好的编程习惯)

于 2012-11-30T15:08:21.640 回答
0

此问题是由语言引起的,因此请在“。”的情况下捕获此异常。并用逗号“,”替换它, 如果你使用这样的模式“##.###”

于 2012-11-30T14:07:42.553 回答