[英]android variable null pointer
我认为我要检查的变量为null。 我的简历方法执行此操作:
此方法检查网络上的电子邮件,如果出现问题,将返回-1。 我以为这样可以。 现在,当我运行它十次时,它开始工作了。 所以我把它给了一个朋友。 他说有时候这给了他例外。
/// Ok found it it was in a try catch in the OnCreate()
tvEmail = (TextView) findViewById(R.id.itemz_email);
tvEmail.setTypeface(TitleFont);
/// and occasionally it didn't even get initialized.
/// I guess ill just init it again in the onResume() just in case.
/// Thanks!
@Override
protected void onResume() {
super.onResume();
tvEmail = (TextView) findViewById(R.id.itemz_email);
tvEmail.setTypeface(TitleFont);
if (EMAIL != null) {
tvEmail.setText("E-mail: " + EMAIL);
} else {
tvEmail.setText("E-mail: No Email Available"); //<----==LINE 77
}
}
这是我的用户得到的错误:
java.lang.RuntimeException: Unable to resume activity {com.codalata.craigslistchecker/com.codalata.craigslistchecker.ItemView}: java.lang.NullPointerException
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2578)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2606)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
at android.app.ActivityThread.access$600(ActivityThread.java:133)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1198)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4777)
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:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.codalata.craigslistchecker.ItemView.onResume(ItemView.java:77)<------/**/error/**/
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
at android.app.Activity.performResume(Activity.java:5082)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2568)
我应该这样检查并设置吗?
if(EMAIL == null){
EMAIL = "E-mail: No Email Available"
tvEmail.setText(EMAIL);
}else {
tvEmail.setText("E-mail: " + EMAIL);
}
您在包含tvEmail.setText(...)
的行上收到NullReferenceException
; 交换条件块以检查EMAIL
是否为null
与not不会改变任何事情,因为EMAIL
不会参与导致错误的行。
您需要查看tvEmail
,因为在发生错误时这就是null
。
由于我们知道空指针异常来自第77行:
tvEmail.setText("E-mail: No Email Available"); //<----==LINE 77
我们知道该字符串不能为null,因为它是用引号定义的。 setText方法不能为null,因为方法不是对象,也不能为null!。 这使我们留给tvEmail对象,该对象必须为null导致空指针异常。 请确保该对象已初始化
tvEmail = new TvEmail();//or something similar
为确保此对象为空(检查我们是否在执行正确的解决方案),请在此行之后插入以下代码
super.onResume();
插入此:
if(tvEmail == null)
System.out.println("tvEmail is null!!!);
如果tvEmail为null,则您可能想重新计算对象或将其设置为类似于以下内容:
tvEmail = (TextView)findViewById(id);
首先检查您在Activity或Fragment.etc。的onCreate
方法中声明了您的对象。如果您想在调用onResume
方法时检查该对象是否不为null,则它应该看起来像这样。 记住在else中将为null,因为您说if
不是,则这样做,否则它的null设置电子邮件不可用,但问题是在else变量中没有引用,换句话说,它为null,您还应该检查为什么此时将其null变量。
if (EMAIL != null) {
tvEmail.setText("E-mail: " + EMAIL);
} else {
tvEmail = (TextView)findViewById(id);
tvEmail.setText("E-mail: No Email Available");
}
已编辑
这不是最好的选择,因为每次调用onResume
都会在其上创建一个新对象。 您应该在调用onResume
之前检查为什么变量为null。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.