【问题标题】:Android App crashes on decimal point input to EditTextAndroid 应用程序在小数点输入到 EditText 时崩溃
【发布时间】:2013-10-12 01:36:50
【问题描述】:

我正在创建一个 Android 应用,该应用通过 EditText 小部件接收基本用户输入(来自键盘)。我在OnItemSelected 函数中为我的ActivitySpinners 调用的一行中出现了一些顽固的行为。我正在从我的EditText 中收集双精度值(进行适当的类型转换),然后应用程序崩溃了。我的 logcat 报告错误是“”不是适当的 double 值,这意味着在 EditText 仍然为空时正在调用此函数(我猜测 Spinners 的初始选择创建Activity)。 Android Studio 在通话中警告我这个可能的异常:

方法调用 'inputView.getText().toString()' 可能会产生更少的 'java.lang.NullPointerException'... (Ctrl+F1) 此检查报告指定检查范围内始终为真或假的条件,并根据代码的数据流分析指出可能引发 RuntimeException 的位置。此检查还报告 Nullable/NotNull 合同违规。可以配置支持合约的注解(默认使用annotations.jar中的@Nullable/@NotNull注解)

我已附加了我的 logcat 消息以及导致类型问题的可疑代码段之一,并以粗体显示相关段。

LogCat

10-12 01:18:22.244    1148-1148/khandy.application.convertible E/AndroidRuntime: FATAL EXCEPTION: main
**java.lang.NumberFormatException: Invalid double: ""**
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.parseDouble(StringToReal.java:248)
at java.lang.Double.parseDouble(Double.java:295)
at **khandy.application.convertible.EntryActivity.onItemSelected(EntryActivity.java:160)**
at android.widget.AdapterView.fireOnSelected(AdapterView.java:892)
at android.widget.AdapterView.access$200(AdapterView.java:49)
at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

代码段:

TextView resultView = (TextView) findViewById(R.id.resultView);
EditText inputView = (EditText)findViewById(R.id.haveTextField);
factor = getFactorFromTable();
double input = Double.parseDouble(**inputView.getText().toString()**);
resultView.setText(Double.toString(input * factor));

关于如何解决和洞察为什么会发生这种情况的任何想法?谢谢

【问题讨论】:

  • 您确定输入或因子不为空吗?

标签: android android-edittext textview android-spinner


【解决方案1】:

(我猜是在创建活动时对微调器的初始选择)

这是正确的。 OnItemSelected() 在您的 Activity 首次启动时被调用。因此,如果此时您的 EditText 为空,那么您将收到异常。

关于如何解决和洞察为什么会发生这种情况的任何想法?

您有很多选择来规避这一点。您可以在其中放置一个默认值,例如 0.0,您可能不想这样做,具体取决于您的应用程序对该值的处理方式。您可以创建一个boolean 标志作为成员变量。将此变量默认设置为true,然后在onItemSelected() 中将其更改为false。然后签入onItemSelected(),如果标志为真,则不要运行代码。

另一种选择是检查您的 EditText 是否为空

if (!"".equals(inputView)
{
    // run your code
}
else
{
     // do nothing or display message indicating that nothing is entered
}

无论您做什么,都应该将其包装在 try/catch 中,或者进行一些错误检查并在输入无效时采取适当的措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多