我正在创建一个Android应用程序,它通过EditText小部件接收基本用户输入(从键盘)。我从我的OnItemSelected函数中调用的Activity's Spinners的一行中得到了一些顽固的行为。我正在从Activity的Spinners中收集双值(执行适当的类型转换),应用程序就会崩溃。我的logcat报告说,错误是"“不是一个合适的double值,这意味着这个函数正在被调用,而EditText仍然是空的(我猜这是创建Activity时对Spinners的最初选择)。Android警告我在调用时可能会出现这样的异常:
方法调用'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));对于如何解决和洞察为什么会发生这种情况,有什么想法吗?谢谢
发布于 2013-10-12 01:54:26
(我猜最初选择的是关于活动创建的纺丝器)
这是正确的。当您的OnItemSelected()第一次启动时,将调用Activity。因此,如果您的EditText此时为空,那么您将得到一个异常。
对于如何解决和洞察为什么会发生这种情况,有什么想法吗?
你有很多选择来规避这个问题。您可以在其中添加一个默认值,比如0.0,根据应用程序对该值所做的操作,您可能不想这样做。您可以创建一个boolean标志作为成员变量。默认情况下将此变量设置为true,然后在onItemSelected()中将其更改为false。然后签入onItemSelected(),如果标志为true,请不要运行代码。
另一种选择是检查EditText是否为空。
if (!"".equals(inputView)
{
// run your code
}
else
{
// do nothing or display message indicating that nothing is entered
}无论您做什么,都应该将其包装在try/catch中,或者进行一些错误检查,并在输入无效时采取适当的操作。
https://stackoverflow.com/questions/19329543
复制相似问题