簡體   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