新startActivity期间Log.i上的NullPointerException

时间:2014-03-14 09:00:19

标签: java android android-asynctask nullpointerexception

我有一个变量的问题。 登录后我从我的数据库中获取了一些数据,以填充我的listView。

一切正常,但在我的AsyncTask结束时,我调用一个名称的方法 set_tour_id ,它将id保存在我的类的私有变量上(称为asynctask)。

像这样,我可以把这个变量放在一个意图中,因为我希望在另一个活动中得到它。

但是我在Activity.putExtra后面的Log.i上有一个 nullPointerException ,而我知道我的私有变量tour_id不是null,因为我把这个变量放到了另一个Log.i上,我有我要发送的数据。

所以这是我在OnPostExecute中的AsyncTask的结束,变量 this.lcp 是我的类的变量,它包含方法:

try {
    if(json_data.has("tour_id")){

        tour_id = json_data.getString("tour_id");
        this.lcp.set_tour_id(tour_id);
        Log.i("OnPostExecute -> after setAdapter -> tour_id ", tour_id);

    }else{
         Log.i("json_data of tour_id", "don't exist");
         }

    } catch (JSONException e) {         
            e.printStackTrace();
    }

这里没有困难.. 这是我的方法 set_tour_id

public void set_tour_id(String new_tour_id){
    this.tour_id = new_tour_id; 
    Log.i("ListCrossingPoint_tour_id", this.tour_id);       
}

在这里,我在LogCat中有我的tour_id,所以通常一切正常。

这是方法 onOptionItemSelect(MenuItem Item)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {     
    case R.id.menu_tour_inf:
        Intent activiteT = new Intent(ListCrossingPoint.this, InfoTour.class);
        activiteT.putExtra("tour_id", this.tour_id);
        Log.i("tour id OnClickItemSelected", this.tour_id); 
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       my error appear just here (on the top :-) )

        startActivity(activiteT);
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

所以我的错误在这里,而我的变量 tour_id 中有一些东西 ..我不明白为什么......

这是LogCat:

03-14 08:38:00.947: E/AndroidRuntime(1225): FATAL EXCEPTION: main
03-14 08:38:00.947: E/AndroidRuntime(1225): java.lang.NullPointerException: println needs a message
03-14 08:38:00.947: E/AndroidRuntime(1225):     at android.util.Log.println_native(Native Method)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at android.util.Log.i(Log.java:159)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.listpoint.ListCrossingPoint.onOptionsItemSelected(ListCrossingPoint.java:263)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at android.app.Activity.onMenuItemSelected(Activity.java:2534)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:958)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:514)
03-14 08:38:00.947: E/AndroidRuntime(1225):     at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:99)
....

编辑1:当我的asynctask是芬兰语时,这是我的LOGCAT:

03-14 09:17:13.691: I/AsyncTaskListCrossingPoint(1351): onPostExecute
03-14 09:17:13.699: I/JARRAY(1351): [{"zip_code":"21500","tel":"03 80 91 54     54","end_hour":"18:00:00","type":"Collection","city":"Montbard","id":"1","closed_client":nul    l,"factory_id":"1","infos":"depose st geosmes","waste_adr":"Foyer mutualiste de montbard     207 rue charles de     gaulle","name":"Dupond","no_waste":null,"tour_id":"1","begin_hour":"08:00:00","internal_erro    r":null,"fax":"03 80 91 54     60","collector_id":"1","status":"0","img_path":null,"producer_id":"1","adress":"Foyer     mutualiste de montbard 207 rue charles de gaulle","waste_code":"21500","miscellaneous":"Mme     loiseau cadre de sante","downtime":"2","id_erp":"C10018-    1","email":"Dupond.patrick@gmail.com","sequence":"1","siret":"732 829 320 00074"}
03-14 09:17:13.699: I/OnPostExecute -> after setAdapter -> tour_id(1351): id :1

编辑2:我在每一步上都显示Log,我的变量是填充的,直到调用方法 set_tour_id ,当我开始新活动时,id为null o_o:

03-14 09:41:31.631: I/JARRAY: [{"waste_adr":"Foyer mutualiste de montbard 207 rue charles de gaulle","name":"Dupond","no_waste":null,"tour_id":"1"}]
03-14 09:41:31.631: I/ListCrossingPoint --> set_tour_id(String new_tour_id) -> tour_id:  id :1
03-14 09:41:31.631: I/Asynctask -> OnPostExecute -> after set_tour_id -> tour_id: id :1
03-14 09:42:06.987: I/ListCrossingPoint --> OnClickItemSelected -> tour_id:  id :null
03-14 09:42:06.987: I/ActivityManager(300): START {cmp=com.main/com.infotour.InfoTour (has extras) u=0} from pid 1481

3 个答案:

答案 0 :(得分:1)

设置this.lcp

tour_id似乎引用了其他一些对象,而您的活动中的tour_id未设置。可能会将this.tour_id更改为this.lcp.tour_id有所帮助。无论如何,要么

  • tour_id尚未设置(毕竟它是异步任务),或者
  • 您设置的tour_id是不同的tour_id

正如您所观察到的,尝试记录null消息会导致此NPE。如果有时可以合法地记录null消息,则可以使用Hariharan的方法来阻止NPE。否则它只是解决症状,而不是原因。

答案 1 :(得分:0)

试试这个..

来自Logcat

03-14 08:38:00.947: E/AndroidRuntime(1225): FATAL EXCEPTION: main
03-14 08:38:00.947: E/AndroidRuntime(1225): java.lang.NullPointerException: println needs a message

println需要一条消息可能是您的 tour_id this.tour_id 为空,请尝试如下添加""+this.tour_id

Log.i("tour id OnClickItemSelected", ""+this.tour_id);

Log.i("OnPostExecute -> after setAdapter -> tour_id ", ""+tour_id);

Log.i("ListCrossingPoint_tour_id", ""+this.tour_id);    

然后使用tour_id,而启动时只使用this.tour_id

答案 2 :(得分:0)

我解决了我的问题。我不是直接在Asynctask中创建ListCrossingPoint对象,而是在ListCrossingPoint中创建一个Asynctask对象,并使用getter获取变量。我认为对象参考有问题。