2016-06-11 15 views
-2

私はAndroidが初めてで、いくつか問題があります。 DB.EmployeeOperations.open()にnullオブジェクトが渡されているようですが、わかりません。 私はステップを逃した? 何か助けていただければ幸いです。データベースオブジェクトを使用している場合のNullPointerException

ありがとうございます。

Logcat

* 06-10 16:10:52.605 17203-17203/com.androidtutorialpoint.employeemanagementsystem E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.androidtutorialpoint.employeemanagementsystem, PID: 17203 
     java.lang.RuntimeException: Unable to resume activity {com.androidtutorialpoint.employeemanagementsystem/com.androidtutorialpoint.employeemanagementsystem.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.androidtutorialpoint.employeemanagementsystem.DB.EmployeeOperations.open()' on a null object reference 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3019) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3050) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2425) 
     at android.app.ActivityThread.access$900(ActivityThread.java:154) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5294) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.androidtutorialpoint.employeemanagementsystem.DB.EmployeeOperations.open()' on a null object reference 
     at com.androidtutorialpoint.employeemanagementsystem.MainActivity.onResume(MainActivity.java:148) 
     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257) 
     at android.app.Activity.performResume(Activity.java:6076) 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3008) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3050) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2425) 
     at android.app.ActivityThread.access$900(ActivityThread.java:154) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 

Javaコード:

public class MainActivity extends AppCompatActivity{ 

    private Button addEmployeeButton; 
    private Button editEmployeeButton; 
    private Button deleteEmployeeButton; 
    private Button viewAllEmployeeButton; 
    private EmployeeOperations employeeOps; 
    private static final String EXTRA_EMP_ID = "com.androidtutorialpoint.empId"; 
    private static final String EXTRA_ADD_UPDATE = "com.androidtutorialpoint.add_update"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     addEmployeeButton = (Button) findViewById(R.id.button_add_employee); 
     editEmployeeButton = (Button) findViewById(R.id.button_edit_employee); 
     deleteEmployeeButton = (Button) findViewById(R.id.button_delete_employee); 
     viewAllEmployeeButton = (Button)findViewById(R.id.button_view_employees); 



     addEmployeeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this,AddUpdateEmployee.class); 
       i.putExtra(EXTRA_ADD_UPDATE, "Add"); 
       startActivity(i); 
      } 
     }); 
     editEmployeeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getEmpIdAndUpdateEmp(); 
      } 
     }); 
     deleteEmployeeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getEmpIdAndRemoveEmp(); 
      } 
     }); 
     viewAllEmployeeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this, ViewAllEmployees.class); 
       startActivity(i); 
      } 
     }); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.employee_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.menu_item_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 


    public void getEmpIdAndUpdateEmp(){ 

     LayoutInflater li = LayoutInflater.from(this); 
     View getEmpIdView = li.inflate(R.layout.dialog_get_emp_id, null); 

     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
     // set dialog_get_emp_id.xml to alertdialog builder 
     alertDialogBuilder.setView(getEmpIdView); 

     final EditText userInput = (EditText) getEmpIdView.findViewById(R.id.editTextDialogUserInput); 

     // set dialog message 
     alertDialogBuilder 
       .setCancelable(false) 
       .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog,int id) { 
           // get user input and set it to result 
           // edit text 
           Intent i = new Intent(MainActivity.this,AddUpdateEmployee.class); 
           i.putExtra(EXTRA_ADD_UPDATE, "Update"); 
           i.putExtra(EXTRA_EMP_ID, Long.parseLong(userInput.getText().toString())); 
           startActivity(i); 
          } 
         }).create() 
       .show(); 

    } 


    public void getEmpIdAndRemoveEmp(){ 

     LayoutInflater li = LayoutInflater.from(this); 
     View getEmpIdView = li.inflate(R.layout.dialog_get_emp_id, null); 

     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
     // set dialog_get_emp_id.xml to alertdialog builder 
     alertDialogBuilder.setView(getEmpIdView); 

     final EditText userInput = (EditText) getEmpIdView.findViewById(R.id.editTextDialogUserInput); 

     // set dialog message 
     alertDialogBuilder 
       .setCancelable(false) 
       .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog,int id) { 
         // get user input and set it to result 
         // edit text 
         employeeOps = new EmployeeOperations(MainActivity.this); 
         employeeOps.removeEmployee(employeeOps.getEmployee(Long.parseLong(userInput.getText().toString()))); 
         Toast t = Toast.makeText(MainActivity.this,"Employee removed successfully!",Toast.LENGTH_SHORT); 
         t.show(); 
        } 
       }).create() 
       .show(); 

    } 



    @Override 
    protected void onResume() { 
     super.onResume(); 
     employeeOps.open(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     employeeOps.close(); 

    } 
} 
+0

私はダイアログがとにかく開いているとき 'onPause'が呼び出されると信じて、あなたは、閉じたデータベース –

答えて

0

それは価値があるのです、問題はあなたがonResume()employeeOps.open()を呼んでいるが、employeeOpsがまだインスタンス化されていませんまだnullです。

Activity lifecycleをご覧ください。

ご覧のとおり、Activityが作成されると、onResume()onCreate()onStart()の前に2つのメソッドが呼び出されます。

open()メソッドをEmployeeOperationsとしたい場合は、onResume()にする必要があります。

onCreate()に次のように呼び出します。

employeeOps = new EmployeeOperations(this); 
+0

うんを得ているでしょう。私はそれを持っている、それは問題だった。問題は解決しました、ありがとう! – Julius

0

あなたの問題はAndroid lifecycleの誤解です。具体的には、そのリソースから、

onCreate()終了実行すると、システムが立て続けにonStart()onResume()メソッドを呼び出します。

これは、employeeOpsをnull以外の値に設定する前に、onResume()がトリガーしていることを意味します。ボタンを押すだけで初期化されますが、アクティビティは非常に短時間表示されてからonResumeがトリガーされます。

関連する問題