2016-03-06 97 views
0

我在尝试访问字段时遇到错误“试图在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)  

但是,正如您所看到的,此字段在之前的其他活动中已成功设置。

可能是什么原因?

+0

David,你说错误发生在onCreate上,但是给出的堆栈跟踪指向了EditTaskActivity中的deleteTaskBtn方法:'at il.ac.shenkar.david.todolistex2.EditTaskActivity.deleteTaskBtn(EditTaskActivity.java:372 )'你在哪里调用ordinal()在一个空位置对象 –

+0

是的,它发生在调用'Location selected_loc = tastToEdit.getTsk_location();' 我通过放置默认值解决了'onCreate'中的问题。 如果我删除了默认值,那么错误也会出现在那里。 添加了来自'deleteTaskBtn'的代码。 –

回答

0

在我看来,这不是关于现场是否已被设置,而是你正试图拉断的意图对象不存在该线路上的onCreate

tastToEdit = (Task)i.getSerializableExtra("task"); 

在此之后添加支票以查看tastToEdit是否为空,如果是这样,请调查为什么它没有正确添加到意图中(如果是这种情况)。

+0

tastToEdit不为空,只有LOCATION为空。 存在'tastToEdit'对象中的其他字段。 –

+0

@DavidFaiz如果tastToEdit肯定不是null,那么你可以发布“Task”的完整类定义,更具体地说'getTsk_location'方法以及它依赖的任何东西吗?此外,你得到的错误的完整堆栈跟踪将是很好的... –

+0

添加错误堆栈。 –

0

看起来你错了关于你在一个活动的onActivityResult()中填充的意图会发生什么。该方法负责处理用startActivityForResult()调用的下一个活动的结果。下一个活动可以使用setResult()为之前的活动设置结果,当被调用的活动完成时,该结果在onActivityResult()中可用。

然而,它看起来像你期待getIntent()在“另一个活动”中能够看到你在onActivityResult()中创建的Intent。事实并非如此。 getIntent()返回用于启动当前正在使用的活动的活动。这与活动结果的意图完全无关。所以你需要改变你在这些活动之间传递数据的策略。

+0

我没有放置调用活动的代码,我得到空问题。 请注意,'tastToEdit'对象不为空,只有LOCATION为空。 'tastToEdit'对象中的其他字段存在。 –

+0

在这种情况下,启动包含意图的“不同活动”的代码在哪里,并且您希望该位置为非空的任务?我们需要能够追踪所有这些对象的路径。 –

+0

我已经添加了更多的代码和完整的错误堆栈。 –

相关问题