我在嘗試訪問字段時遇到錯誤「試圖在Android上的空對象引用上調用方法'...'之前設置。 我檢查設置它不是null,但是當它在不同的activity中被訪問時,它是'null'。 這個字段是與其他人一起創建的,出於某種原因,它是唯一一個看起來像舊的空引用。Android - 嘗試在空對象上調用方法'...'參考
討論對象
public enum Locations {
Meeting_Room,Office_245,Lobby,NOC,VPsoffice
}
類聲明:
public class Task implements Serializable {
private long taskId;
private String description;
private Boolean completed = false;
private Category task_catg;
private Task_Status task_sts;
private Locations tsk_location;
}
public Locations getTsk_location() {
return tsk_location;
}
public void setTsk_location(Locations tsk_location) {
this.tsk_location = tsk_location;
}
請注意,Task_Status & 類別也枚舉,而我不遇到任何問題他們。
這是對象初始化的地方,我在這裏添加了打印,並且看到活動返回的值不爲null。 新任務活動
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode == RESULT_OK) {
switch (requestCode) {
case ACTIVITY_SELECT_LOCATION:
{
/*returned_selc_loc = (Locations) data.getSerializableExtra("location");
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);*/
switch(Globals.temp)
{
case 0:
returned_selc_loc=Locations.Meeting_Room;
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);
break;
case 1:
returned_selc_loc=Locations.Office_245;
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);
break;
case 2:
returned_selc_loc=Locations.Lobby;
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);
break;
case 3:
returned_selc_loc=Locations.NOC;
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);
break;
case 4:
returned_selc_loc=Locations.VPsoffice;
loc.setText(returned_selc_loc.toString());
loc.setClickable(false);
break;
}
break;
}
default:
break;
}
}
}
這是在創建任務的地方對象和地點設置: 新任務活動
public void addTaskBtn (View view)
{
boolean state=true;
EditText desc = (EditText)findViewById(R.id.newTaskDesc);
EditText date = (EditText)findViewById(R.id.taskDateEdit);
EditText time = (EditText)findViewById(R.id.taskTimeEdit);
loc = (EditText)findViewById(R.id.taskLocation);
Date myDate = null;
RadioButton rb;
String emp_name;
t = new Task(desc.getText().toString());
t.setTask_sts(Task_Status.WAITING);
int position = spin.getSelectedItemPosition();
switch(position)
{
case 0:
t.setTask_catg(Category.GENERAL);
break;
case 1:
t.setTask_catg(Category.CLEANING);
break;
case 2:
t.setTask_catg(Category.ELECTRICITY);
break;
case 3:
t.setTask_catg(Category.COMPUTERS);
break;
case 4:
t.setTask_catg(Category.OTHER);
break;
}
//Added prints here and value is set correctly, definitely not NULL.
t.setTsk_location(returned_selc_loc);
t.setTaskId(task_id);
task_id++;
Intent returnIntent = new Intent();
dbm = DBManager.getInstance(this);
long seq_tsk_id = dbm.addTask(t);
t.setTaskId(seq_tsk_id);
returnIntent.putExtra("task", t);
setResult(RESULT_OK, returnIntent);
finish();
}
這是調用編輯任務活動,調用來自MainActivity。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
dbM = DBManager.getInstance(context);
itemList = dbM.getAllTasks();
list.setAdapter(new TaskItemAdapter(context, itemList));
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long arg3) {
//get item instance from list
Task tt = (Task) ((TaskItemAdapter) parent.getAdapter()).getItem(position);
if(true)
{
//start the create activity again, now for editing
Intent i = new Intent(getApplicationContext(), EditTaskActivity.class);
i.putExtra("task", tt);
startActivityForResult(i, REQUEST_CODE_UPDATE_TASK);
}
return false;
}
});
}
編輯任務活動 這是我的錯誤(只留下相關的部分,作爲對象的其它變量是成功的,
public void deleteTaskBtn(View view)
{
Intent returnIntent = new Intent(this,MainActivity.class);
Intent i = getIntent();
tastToEdit = (Task)i.getSerializableExtra("task");
tastToEdit.setToDelete(true);
ParseObject parse_task = new ParseObject("Task");
parse_task.put("Description",tastToEdit.getDescription());
parse_task.put("DueDate",tastToEdit.getDueDate());
parse_task.put("Priority",tastToEdit.getPriority().ordinal());
int com_state = (tastToEdit.getCompleted()) ? 1 : 0;
parse_task.put("IsCompleted",com_state);
parse_task.put("Location", tastToEdit.getTsk_location().ordinal());
parse_task.put("Category",tastToEdit.getTask_catg().ordinal());
parse_task.put("Status", tastToEdit.getTask_sts().ordinal());
parse_task.put("TeamName",Globals.team_name);
parse_task.put("Employee",tastToEdit.getEmp_name());
parse_task.deleteInBackground(new DeleteCallback() {
public void done(ParseException e) {
if (e == null) {
Log.d("msg","deleted");
} else {
Log.d("msg", "not deleted");
e.printStackTrace();
}
}
});
returnIntent.putExtra("task",tastToEdit);
setResult(RESULT_OK, returnIntent);
finish();
}
此行返回NULL參考:
Location selected_loc = tastToEdit.getTsk_location();
完全錯誤堆棧
03-09 21:28:20.192 10425-10425/? I/art: Late-enabling -Xcheck:jni
03-09 21:28:20.229 10425-10433/? I/art: Debugger is no longer active
03-09 21:28:20.240 10425-10425/? W/System: ClassLoader referenced unknown path: /data/app/il.ac.shenkar.david.todolistex2-1/lib/arm
03-09 21:28:20.446 10425-10456/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
03-09 21:28:20.508 10425-10456/? I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/21/15, 369a2ea, I96aee987eb
03-09 21:28:20.511 10425-10456/? I/OpenGLRenderer: Initialized EGL, version 1.4
03-09 21:28:27.832 10425-10425/il.ac.shenkar.david.todolistex2 I/Choreographer: Skipped 52 frames! The application may be doing too much work on its main thread.
03-09 21:28:28.397 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0xb38ccf80 (RippleDrawable) with handle 0xaef7fe30
03-09 21:28:29.620 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0xb39ba400 (RippleDrawable) with handle 0xaef7f9e0
03-09 21:28:30.360 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0xb397f900 (RippleDrawable) with handle 0xb3b29370
03-09 21:28:32.921 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0x9f2cbb80 (ListPopupWindow$DropDownListView) with handle 0xb3b29530
03-09 21:28:33.437 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0x9f2cad80 (RippleDrawable) with handle 0xb3b295d0
03-09 21:28:40.866 10425-10456/il.ac.shenkar.david.todolistex2 V/RenderScript: 0x9dca9000 Launching thread(s), CPUs 4
03-09 21:28:40.907 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0xb3947700 (RippleDrawable) with handle 0xb3b29910
03-09 21:28:44.971 10425-10425/il.ac.shenkar.david.todolistex2 W/sdas: null
03-09 21:28:45.143 10425-10456/il.ac.shenkar.david.todolistex2 D/OpenGLRenderer: endAllStagingAnimators on 0xb39b5380 (ListView) with handle 0xaef7f510
03-09 21:28:48.110 10425-10425/il.ac.shenkar.david.todolistex2 D/AndroidRuntime: Shutting down VM
03-09 21:28:48.111 10425-10425/il.ac.shenkar.david.todolistex2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: il.ac.shenkar.david.todolistex2, PID: 10425
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:278)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int il.ac.shenkar.david.todolistex2.Location.ordinal()' on a null object reference
at il.ac.shenkar.david.todolistex2.EditTaskActivity.deleteTaskBtn(EditTaskActivity.java:372)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
但是,正如您所看到的,此字段在之前的其他活動中已成功設置。
可能是什麼原因?
David,你說錯誤發生在onCreate上,但是給出的堆棧跟蹤指向了EditTaskActivity中的deleteTaskBtn方法:'at il.ac.shenkar.david.todolistex2.EditTaskActivity.deleteTaskBtn(EditTaskActivity.java:372 )'你在哪裏調用ordinal()在一個空位置對象 –
是的,它發生在調用'Location selected_loc = tastToEdit.getTsk_location();' 我通過放置默認值解決了'onCreate'中的問題。 如果我刪除了默認值,那麼錯誤也會出現在那裏。 添加了來自'deleteTaskBtn'的代碼。 –