2016-05-09 24 views
-2

私はこのエラーを取得しています:ERROR:Androidのランタイム:致命的な例外java.lang.RuntimeException

05-09 23:34:04.251 21214-21214/com.example.averm.phonecontact E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.averm.phonecontact, PID: 21214 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.averm.phonecontact/com.example.averm.phonecontact.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.averm.phonecontact.DatabaseHandler.getContactsCount()' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2335) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2397) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5268) 
    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:902) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.averm.phonecontact.DatabaseHandler.getContactsCount()' on a null object reference 
    at com.example.averm.phonecontact.MainActivity.onCreate(MainActivity.java:106) 
    at android.app.Activity.performCreate(Activity.java:6033) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2397) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5268) 
    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:902) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697) 

マイコードは次のとおりです。

MainActivity.javaクラス:

public class MainActivity extends AppCompatActivity { 

    private EditText nameTxt, phoneTxt, emailTxt, addressTxt; 
    ImageView contactImageImgView; 
    List<Contact> Contacts = new ArrayList<Contact>(); 
    ListView contactListView; 
    Uri imageUri = Uri.parse("android.resource://org.intracode.contactmanager/drawable/no_user_logo.png"); 
    DatabaseHandler dbHandler; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     nameTxt = (EditText)findViewById(R.id.edName); 
     phoneTxt = (EditText)findViewById(R.id.edNumber); 
     emailTxt = (EditText)findViewById(R.id.edEmail); 
     addressTxt = (EditText)findViewById(R.id.edAddress); 
     contactListView = (ListView)findViewById(R.id.listView); 
     contactImageImgView = (ImageView)findViewById(R.id.imgViewContactImage); 


     TabHost tabHost = (TabHost)findViewById(R.id.tabHost); 
     tabHost.setup(); 
     TabHost.TabSpec tabSpec = tabHost.newTabSpec("creator"); 
     tabSpec.setContent(R.id.tabCreator); 
     tabSpec.setIndicator("Creator"); 
     tabHost.addTab(tabSpec); 

     tabSpec = tabHost.newTabSpec("List"); 
     tabSpec.setContent(R.id.tabContactList); 
     tabSpec.setIndicator("List"); 
     tabHost.addTab(tabSpec); 


     final Button addBtn = (Button)findViewById(R.id.btnAdd); 

     addBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Contact contact = new Contact(dbHandler.getContactsCount(), String.valueOf(nameTxt.getText()), String.valueOf(phoneTxt.getText()), 
         String.valueOf(emailTxt.getText()), String.valueOf(addressTxt.getText()), imageUri); 
       if (!contactExists(contact)){ 
        dbHandler.createContact(contact); 
        Contacts.add(contact); 
        Toast.makeText(getApplicationContext(),String.valueOf(nameTxt.getText()) +" has been added to your Contacts!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
       Toast.makeText(getApplicationContext(), String.valueOf(nameTxt.getText()) + " already exists. Please use a different name.", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     nameTxt.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       addBtn.setEnabled(String.valueOf(nameTxt.getText()).trim().length() > 0); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     contactImageImgView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, "Select Contact Image"), 1); 
      } 
     }); 

     if (dbHandler.getContactsCount() != 0) 
      Contacts.addAll(dbHandler.getAllContacts()); 
     populateList(); 

    } 

    public void onActivityResult(int reqCode, int resCode, Intent data){ 
     if (resCode == RESULT_OK){ 
      if (reqCode == 1){ 
       imageUri = data.getData(); 
       contactImageImgView.setImageURI(imageUri); 
      } 
     } 
    } 

    private boolean contactExists(Contact contact) { 
     String name = contact.getName(); 
     int contactCount = Contacts.size(); 
     for (int i = 0; i < contactCount; i++) { 
      if (name.compareToIgnoreCase(Contacts.get(i).getName()) == 0) 
       return true; 
     } 
     return false; 
    } 



    private void populateList(){ 
     ArrayAdapter<Contact> adaptor= new ContactListAdaptor(); 
     contactListView.setAdapter(adaptor); 

    } 


    private class ContactListAdaptor extends ArrayAdapter<Contact>{ 
     public ContactListAdaptor(){ 
      super(MainActivity.this,R.layout.listview_item, Contacts); 
     } 

     @Override 
     public View getView(int position, View view, ViewGroup parent){ 
      if(view == null) 
       view = getLayoutInflater().inflate(R.layout.listview_item, parent, false); 

      Contact currentContact = Contacts.get(position); 

      TextView name = (TextView) view.findViewById(R.id.contactName); 
      name.setText(currentContact.getName()); 
      TextView phone = (TextView) view.findViewById(R.id.phoneNumber); 
      phone.setText(currentContact.getPhone()); 
      TextView email = (TextView) view.findViewById(R.id.emailAddress); 
      email.setText(currentContact.getEmail()); 
      TextView address = (TextView) view.findViewById(R.id.cAddress); 
      address.setText(currentContact.getAddress()); 
      ImageView ivContactImage = (ImageView) view.findViewById(R.id.ivContactImage); 
      ivContactImage.setImageURI(currentContact.getImageURI()); 
      return view; 
     } 
    } 
} 

DatabaseHandler。 javaクラス:

public class DatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 2; 
    private static final String DATABASE_NAME = "contactManager", 
      TABLE_CONTACTS = "contacts", 
      KEY_ID = "id", 
      KEY_NAME = "name", 
      KEY_PHONE = "phone", 
      KEY_EMAIL = "email", 
      KEY_ADDRESS = "address", 
      KEY_IMAGEURI = "imageUri"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_PHONE + " TEXT," + KEY_EMAIL + " TEXT," + KEY_ADDRESS + " TEXT," + KEY_IMAGEURI + " TEXT)"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 
     onCreate(db); 
    } 

    public void createContact(Contact contact) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact.getName()); 
     values.put(KEY_PHONE, contact.getPhone()); 
     values.put(KEY_EMAIL, contact.getEmail()); 
     values.put(KEY_ADDRESS, contact.getAddress()); 
     values.put(KEY_IMAGEURI, contact.getImageURI().toString()); 
     db.insert(TABLE_CONTACTS, null, values); 
     db.close(); 
    } 

    public Contact getContact(int id) { 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS, KEY_IMAGEURI }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 
     Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5))); 
     db.close(); 
     cursor.close(); 
     return contact; 
    } 



    public int getContactsCount() { 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS, null); 
     int count = cursor.getCount(); 
     db.close(); 
     cursor.close(); 
     return count; 
    } 
} 
+1

を追加するには、 '(dbHandler.getContactsCount()!= 0)場合、'決してやります'dbHandler'を設定してヌルにして、NPEを取得してください –

答えて

0

インスタンスを作成しましたが、DatabaseHandlerを初期化したことがありません。あなたはクラスのオブジェクトを作成する必要があり、その後、あなたの活動のmethods.InのonCreateにアクセスするためにそれを使用する以下のコード

DatabaseHandler dbHandler=new DatabaseHandler(this) 
+0

ありがとう:)問題が解決しました。 –

0

dbHandlerフィールドがあります。 onCreate()dbHandler=new DatabaseHandler(this)と決して電話することはないので、dbHandlernullです。

また、バックグラウンドスレッドでデータベースI/Oを実行してください。

+0

ありがとう:)問題が解決しました –

関連する問題