我有一个变量的问题。 登录后我从我的数据库中获取了一些数据,以填充我的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
答案 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)