繁体   English   中英

Android变量空指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM