【问题标题】:android variable null pointerandroid变量空指针
【发布时间】:2013-12-27 20:52:00
【问题描述】:

我认为我正在检查的变量为空。 我的简历方法是这样做的:

此方法检查网络上的电子邮件,如果出现问题,将返回 -1。 我以为这会奏效。现在,当我运行它 10 次时,它正在工作。所以我把它给了一个朋友。他说这有时会给他带来例外。

///   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);
}

【问题讨论】:

  • Waht 是tvEmail,您确定它不为空吗?
  • tvEmail 必须是 null 它不会是您的 EMAIL 变量,因为您甚至没有在该行上使用它。发布您如何初始化tvEmail
  • 在该行放置一个断点。调试你的程序。检查变量。什么是空?
  • 你在哪里创建tvEmail?我们能看到那个代码吗?
  • “我想我只是在 onResume() 中再次初始化它以防万一。”这太疯狂了。找出阻止它被初始化的异常并修复它,或者只是将初始化移到try/catch之外。可能没有理由将其初始化两次“以防万一”

标签: java android variables null


【解决方案1】:

您在包含tvEmail.setText(...) 的行上收到NullReferenceException;交换条件块以检查 EMAILnull 与 not 不会改变事情,因为 EMAIL 没有参与导致错误的行。

您需要查看tvEmail,因为是您发生错误时的null

【讨论】:

  • tvEmail 是一个 TextView。它应该在 onCreate 中初始化,但显然在某些情况下它没有被初始化。我们需要查看该代码。
【解决方案2】:

由于我们知道空指针异常来自第 77 行:

tvEmail.setText("E-mail: No Email Available");  //<----==LINE 77

我们知道字符串不能为空,因为它是用引号定义的。方法 setText 不能为空,因为方法不是对象,不能为空!。这将我们留给 tvEmail 对象,该对象必须为空,导致空指针异常。请确保该对象已初始化

 tvEmail = new TvEmail();//or something similar

为了确保这个对象为空(检查我们是否在做正确的解决方案)在

之后插入这行代码
 super.onResume();

插入:

if(tvEmail == null) 
    System.out.println("tvEmail is null!!!);

如果 tvEmail 为 null,您可能想要重新创建对象或将其设置为等于以下内容:

 tvEmail = (TextView)findViewById(id);

【讨论】:

    【解决方案3】:

    首先检查您在 Activity 或 Fragment.etc 的 onCreate 方法中声明了您的对象。 如果您想在调用 onResume 方法时检查对象是否不为空,则应该如下所示。请记住,它在 else 中将为空,因为您说 if 它不为空,否则它的空集电子邮件不可用,但问题是在 else 中该变量没有引用,换句话说它为空,您还应该检查为什么你的变量在那时为空。

    if (EMAIL != null) {
        tvEmail.setText("E-mail: " + EMAIL);
    } else {
        tvEmail = (TextView)findViewById(id);
        tvEmail.setText("E-mail: No Email Available");
    }
    

    已编辑

    这不是最好的选择,因为每次调用它都会在onResume 上创建一个新对象。您应该在调用onResume 之前检查变量为何为空​​。

    【讨论】:

    • 问题不是 EMAIL 为空,而是 tvEmail。
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多