2013-03-24 36 views
0

問題:強制關閉第65行 - saveContact();NullPointerException 65行強制關閉 - saveContact(); - 評估變量爲空[Noob Warning]

注:

大家好 - 我想節省一點的數據在我的數據庫和應用程序總是崩潰。我對這一切有點新,所以我想知道如果有人能解釋我做錯了什麼。我相信這是簡單的...但我不知道如何解決它。

任何和所有的幫助,非常感謝!

NoobNinja

import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.view.ViewGroup; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.FrameLayout; 
    import android.widget.TimePicker; 

    public class AddEditCountry extends Activity { 

     private long rowID; 
     private EditText nameEt; 
     private EditText capEt; 
     private EditText codeEt; 
     private TimePicker timeEt; 
     private TimePicker minEt; 
     public static final String KEY_BUNDLE_TIME = "time"; 
     public static final String KEY_BUNDLE_MIN = "min"; 

      @Override 
      public void onCreate(Bundle savedInstanceState) 
      { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.add_country); 

       nameEt = (EditText) findViewById(R.id.nameEdit); 
       capEt = (EditText) findViewById(R.id.capEdit); 
       codeEt = (EditText) findViewById(R.id.codeEdit); 
       timeEt = (TimePicker) findViewById(R.id.timeEdit); 
       minEt = (TimePicker) findViewById(R.id.minEdit); 


       Bundle extras = getIntent().getExtras(); 

       if (extras != null) 
       { 
       rowID = extras.getLong("row_id"); 
       nameEt.setText(extras.getString("name")); 
       capEt.setText(extras.getString("cap")); 
       codeEt.setText(extras.getString("code")); 
       timeEt.setCurrentHour(extras.containsKey(KEY_BUNDLE_TIME) ? extras.getInt(KEY_BUNDLE_TIME) : 0); 
       minEt.setCurrentMinute(extras.getInt("min")); 
       } 

       Button saveButton =(Button) findViewById(R.id.saveBtn); 
       saveButton.setOnClickListener(new OnClickListener() { 

        public void onClick(View v) 
        { 
        if (nameEt.getText().length() != 0) 
        { 
         AsyncTask<Object, Object, Object> saveContactTask = 
          new AsyncTask<Object, Object, Object>() 
          { 
           @Override 
           protected Object doInBackground(Object... params) 
           { 
           saveContact(); 
           return null; 
           } 

           @Override 
           protected void onPostExecute(Object result) 
           { 
           finish(); 
           } 
          }; 

         saveContactTask.execute((Object[]) null); 
        } 

        else 
        { 
         AlertDialog.Builder alert = new AlertDialog.Builder(AddEditCountry.this); 
         alert.setTitle(R.string.errorTitle); 
         alert.setMessage(R.string.errorMessage); 
         alert.setPositiveButton(R.string.errorButton, null); 
         alert.show(); 
        } 
        } 
      }); 
      } 


       private void saveContact() 
       { 
        DatabaseConnector dbConnector = new DatabaseConnector(this); 

        if (getIntent().getExtras() == null) 
        { 
         dbConnector.insertContact(nameEt.getText().toString(), 
           capEt.getText().toString(), 
           timeEt.getCurrentHour().toString(), 
           minEt.getCurrentMinute().toString(), 
           codeEt.getText().toString(), 
           timePicker.getCurrentHour().toString(), 
           timePicker.getCurrentMinute().toString()); 

        } 
        else 
        { 
        dbConnector.updateContact(rowID, 
         nameEt.getText().toString(), 
         capEt.getText().toString(), 
         timeEt.getCurrentHour().toString(), 
         minEt.getCurrentMinute().toString(),/* Storing as String*/ 
         codeEt.getText().toString()); 
        } 
       } 
    } 














    import android.content.ContentValues; 
    import android.content.Context; 
    import android.database.Cursor; 
    import android.database.SQLException; 
    import android.database.sqlite.SQLiteDatabase; 



    public class DatabaseConnector { 

     public static final String KEY_BUNDLE_TIME = "time"; 
     public static final String KEY_BUNDLE_MIN = "min"; 
     private static final String DB_NAME = "WorldCountries"; 
     private SQLiteDatabase database; 
     private DatabaseOpenHelper dbOpenHelper; 

     public DatabaseConnector(Context context) { 
      dbOpenHelper = new DatabaseOpenHelper(context, DB_NAME, null, 1); 
     } 

      public void open() throws SQLException 
      { 
       //open database in reading/writing mode 
       database = dbOpenHelper.getWritableDatabase(); 
      } 

      public void close() 
      { 
       if (database != null) 
       database.close(); 
      }  

      public void insertContact(String name, String cap, String code, String time, String min) 
        { 
         ContentValues newCon = new ContentValues(); 
         newCon.put("name", name); 
         newCon.put("cap", cap); 
         newCon.put("time", time); 
         newCon.put("min", min); 
         newCon.put("code", code); 
         newCon.put(AddEditCountry.KEY_BUNDLE_TIME, time); 
         newCon.put(AddEditCountry.KEY_BUNDLE_MIN, min); 

         open(); 
         database.insert("country", null, newCon); 
         close(); 
        } 


        public void updateContact(long id, String name, String cap,String code, String time, String min) 
        { 
         ContentValues editCon = new ContentValues(); 
         editCon.put("name", name); 
         editCon.put("cap", cap); 
         editCon.put("time", time); 
         editCon.put("min", min); 
         editCon.put("code", code); 
         editCon.put(AddEditCountry.KEY_BUNDLE_TIME, time); 
         editCon.put(AddEditCountry.KEY_BUNDLE_MIN, min); 
         open(); 
         database.update("country", editCon, "_id=" + id, null); 
         close(); 
        } 


        public Cursor getAllContacts() 
        { 
         return database.query("country", new String[] {"_id", "name"}, 
         null, null, null, null, "name"); 
        } 

        public Cursor getOneContact(long id) 
        { 
         return database.query("country", null, "_id=" + id, null, null, null, null); 
        } 

        public void deleteContact(long id) 
        { 
         open(); 
         database.delete("country", "_id=" + id, null); 
         close(); 
        } 
    } 


PROBLEMS: 


timePicker cannot be resolved AddEditCountry.java line 104 
minEdit cannot be resolved or is not a field AddEditCountry.java line 37 
timePicker cannot be resolved AddEditCountry.java line 103  

回答

1

我覺得問題是這一行:

minEt.getCurrentMinute().toString() 

您正在試圖獲取數據從TimePicker分配給NULL

private TimePicker minEt; 

,這是你的應用程序崩潰的原因。解決方案是初始化你的TimePicker,它應該工作。因此,請刪除您初始化的評論。

+0

當我不發表評論時,我收到錯誤「描述\t資源minEdit無法解析或不是字段。」 (這就是爲什麼我把它首先註釋掉[測試目的] – NoobNinja 2013-03-24 22:48:23

+0

@NoobNinja,但現在你的timepicker沒有初始化,所以你不能從它獲取數據 – Sajmon 2013-03-24 22:50:24

+0

那麼我應該怎麼做,在取消了minEdit 時和一個 - T的註釋掉 – NoobNinja 2013-03-24 23:03:44

0

您是否在任何字段中設置了數據?您提供的堆棧跟蹤說,這是由於在NPE線路101

03-24 00:49:10.643: E/AndroidRuntime(6809):  at com.nfc.linkingmanager.AddEditCountry.saveContact(AddEditCountry.java:101) 

不知道只是哪條線路或者區域,我只是猜測,但你可以改變你的saveContact使用方法:

findViewById(R.id.nameEdit).getText().toString() 

如:

dbConnector.insertContact(
    findViewById(R.id.nameEdit).getText().toString(), 
    findViewById(R.id.nameEdit).getText().toString().getText().toString(), 
    etc... 

基本上,你的增值經銷商之一爲null,並且你想使用它。

+0

我加入dbConnector.insertContact(nameEt.getText()。toString()方法, \t \t capEt.getText()。toString()方法, \t \t timeEt.getCurrentHour()。的toString( ), \t \t minEt.getCurrentMinute()。的toString(), \t \t codeEt.getText()。的toString(), \t \t findViewById(R.id.nameEdit).getText()。的toString(), \t \t findViewById(R.id.nameEdit).getText()。toString()。getText()。toString()); 但我得到一個問題,說明「的方法getText()是未定義的類型查看\t AddEditCountry.java \t第10行 – NoobNinja 2013-03-24 22:58:12

+0

好吧,你需要鑄造才能使它工作,但我認爲@Saymon的文章是你需要遵循什麼。 – Dave 2013-03-24 23:02:55