我的应用程序下载器的奇怪NumberFormatException

时间:2012-11-30 13:59:19

标签: android exception

我最近在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)

2 个答案:

答案 0 :(得分:1)

如果此行导致问题:

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

你应该替换它(假设worldWidth是float / double):

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

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

或者您可以在创建/获取实例DecimalFormat时强制使用区域设置:

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

我认为Ali提供的快速修复(捕获异常)不是一个好的解决方案(因为捕获预期的异常是错误的编程实践)

答案 1 :(得分:0)

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