0

最近グーグルプレイで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あなたはそれを( float/doubleであると仮定して)と置き換える必要があります:

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

df.format(double/float)1つ目: この値を文字列に変更して再度解析する必要はありません。2つ目:言語/ロケールがコンマを使用してロケールに設定されているデバイスで、小数点記号としてコンマ付きの double/float の文字列表現を返すことができると確信しています。セパレーターとして (英語以外のヨーロッパのほぼ全体)

または、インスタンスの作成/取得時にロケールを強制できますDecimalFormat:

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

アリが提供するクイックフィックス(例外をキャッチする)は良い解決策ではないと思います(予想される例外をキャッチするのは悪いプログラミング慣行であるため)

于 2012-11-30T15:08:21.640 に答える
0

この問題は言語が原因であるため、「.」の場合にこの例外をキャッチします。この「##.###」のようなパターンを使用している場合は、これをカンマ「,」に置き換え ます

于 2012-11-30T14:07:42.553 に答える