2012-11-30 15 views
0

最近我发布了对我的Android应用(GitHubRepo)的更新,并且我已经开始通过Play商店从用户接收错误报告。我正在尝试排除故障,但我无法准确跟踪错误的含义。无法重现NumberFormatException

以下是报告的样子:

java.lang.RuntimeException: Unable to start activity ComponentInfo{ca.ajwest.BeerConverter/ca.ajwest.BeerConverter.BeerConverterActivity}: java.lang.NumberFormatException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NumberFormatException 
at org.apache.harmony.luni.util.FloatingPointParser.parseDblImpl(Native Method) 
at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:283) 
at java.lang.Double.parseDouble(Double.java:318) 
at java.lang.Double.valueOf(Double.java:356) 
at ca.ajwest.BeerConverter.BeerConverterActivity.roundTwoDecimals(BeerConverterActivity.java:1513) 
at ca.ajwest.BeerConverter.BeerConverterActivity.calculate(BeerConverterActivity.java:987) 
at ca.ajwest.BeerConverter.BeerConverterActivity.access$0(BeerConverterActivity.java:757) 
at ca.ajwest.BeerConverter.BeerConverterActivity$21.onTextChanged(BeerConverterActivity.java:469) 
at android.widget.TextView.sendOnTextChanged(TextView.java:6584) 
at android.widget.TextView.setText(TextView.java:2813) 
at android.widget.TextView.setText(TextView.java:2671) 
at android.widget.EditText.setText(EditText.java:178) 
at ca.ajwest.BeerConverter.BeerConverterActivity.onCreate(BeerConverterActivity.java:541) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
... 11 more 

上午我在假设它是与我的舍入方法被四舍五入的值是否正确?

double roundTwoDecimals(double d){ 
     DecimalFormat twoDForm = new DecimalFormat("#.##"); 
     return Double.valueOf(twoDForm.format(d)); 
    } 

有没有人有任何提示,如果我似乎无法重现我的设备上的错误如何进行?该应用程序严重依赖于用户输入数字,甚至在我的领域尝试了各种'凌乱'的数字(我尝试了一些非常长的数字)后,它对我来说完美无瑕。

+0

你将重现它,当你改变手机的语言'German' –

+0

你有NumberFormatException异常。你是否对其他输入进行了测试,而不是像字符这样的数字? –

+0

这个double,你得到的形式可以是'2,25',因为','在某些国家正在使用。 –

回答

1

您可能尚未计入用户区域设置。许多语言环境对分隔符使用逗号。

这将强制您的格式化程序使用点作为分隔符。

double roundTwoDecimals(double d){ 

    DecimalFormat twoDForm = new DecimalFormat("#.##"); 
    DecimalFormatSymbols dfSymbols = new DecimalFormatSymbols(); 
    twoDForm.setDecimalSeparator('.'); 
    format.setDecimalFormatSymbols(dfSymbols); 

    return Double.valueOf(twoDForm.format(d)); 
} 

如果用户手动输入号码,你可以得到的语言环境分离并使用它。

DecimalFormat.getInstance().getDecimalFormatSymbols().getDecimalSeparator(); 

PS。你的假设是正确的。通常,读取堆栈跟踪,直到您看到应用程序中的包名。这指向的那一行,在这种情况下:

ca.ajwest.BeerConverter.BeerConverterActivity.roundTwoDecimals(BeerConverterActivity.java:1513) 
+0

太棒了!非常感谢!这正是问题所在。我做了一个编辑,因为我认为当你适应我的情况时,只有一点点混乱。 – ajwest

+1

不客气。很高兴帮助。我要看看你的应用程序。任何带有称为BeerConverter的活动都必须进行检查;) – Simon