2016-02-12 60 views
0

我想在android studio中製作一個To Do應用程序。但只要我點擊添加按鈕(+在右上角)應用程序崩潰。我很新的Java和Android的工作室,但我認爲這個問題可以躺在「saveListInfo()」,但我無法弄清楚如何解決它......要做應用程序崩潰

代碼從EditedActivity.java:

public class EditedActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_edited); 

     String name; 
     name = getIntent().getStringExtra("theName"); 

     EditText editList = (EditText) findViewById(R.id.editText); 
     editList.setText(name); 
    } 


    private void saveListInfo() { 
     EditText editList = (EditText) findViewById(R.id.editText); 
     String name = editList.getText().toString(); 

     Bundle listBundle = new Bundle(); 
     listBundle.putString("name", name); 

     Intent finalIntent = new Intent(this, MainActivity.class); 
     finalIntent.putExtras(listBundle); 

     setResult(RESULT_OK, finalIntent); 

    } 

    Button addBtn = (Button) findViewById(R.id.add_btn); 

    { 
     addBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       saveListInfo(); 
      } 
     }); 
    } 
} 
從MainActivity.java

代碼:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_add_task: 
       saveTodoInfo(); 

     } 

     return true; 
    } 

    private void saveTodoInfo(){ 
     TextView nameView = (TextView) findViewById(R.id.action_add_task); 
     String name = nameView.getText().toString(); 

     Intent myIntent = new Intent(this, EditedActivity.class); 
     myIntent.putExtra("theName", name); 

     startActivityForResult(myIntent, 0); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 0){ 
      if(resultCode == RESULT_OK){ 
       Bundle ListBundle = data.getExtras(); 
       String name = ListBundle.getString("theName"); 

       updateToDo(name); 
      } 
     } 

    } 

    private void updateToDo(String name){ 
     TextView nameView = (TextView) findViewById(R.id.action_add_task); 
     nameView.setText(name); 
    } 


} 

這是點擊添加按鈕時,我得到的錯誤:

02-12 16:07:40.553 1410- 1410/com.carpe_diem.anitas_todolist E/AndroidRuntime:致命異常:主 工藝:com.carpe_diem.anitas_todolist,PID:1410 了java.lang.RuntimeException:無法實例活動 ComponentInfo {com.carpe_diem.anitas_todolist/COM。 carpe_diem.anitas_todolist.EditedActivity}: 顯示java.lang.NullPointerException:嘗試在 android.app上一個空 對象引用 調用虛擬方法 'android.view.View android.view.Window.findViewById(INT)'。 ActivityThread.performLaunchActivity(ActivityThread.java:2327) at android.app.ActivityThread.handleLaunchActivity(Activity Thread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage( Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(本地方法) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 由於:java.lang.NullPointerException:嘗試調用虛擬 方法'android.view.View android.view.Window.findViewById(int)'在 空對象引用 at android.app.Activity.findViewById(Activity的.java:2090) 在 com.carpe_diem.anitas_todolist.EditedActivity(EditedActivity.java:40) 在java.lang.Class.newInstance(本機方法) 在android.app.Instrumentation.newActivity(Instrumentation.java: 1067) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java .lang.reflect.Method。調用(本地方法) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

+1

我想知道爲什麼這個問題被關閉爲重複只是因爲指示「NullPointerException」 – Jorgesys

回答

1

通過日誌,我們可以看到,你崩潰是在下面的行發生的事情:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference at 
android.app.Activity.findViewById(Activity.java:2090) at 
com.carpe_diem.anitas_todolist.EditedActivity.(EditedActivity.java:40) 
... 

後檢查你的代碼,我可以在第40行(EditedActivity.java:40)中發現下面的代碼不在任何方法或函數中。

Button addBtn = (Button) findViewById(R.id.add_btn); 
{ 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

所以,你必須將上面的行移動到onCreate()方法。

EditedActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edited); 

    String name; 
    name = getIntent().getStringExtra("theName"); 

    EditText editList = (EditText) findViewById(R.id.editText); 
    editList.setText(name); 

    Button addBtn = (Button) findViewById(R.id.add_btn); 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

根源

如果您在下面留下任何方法的行外,將對象實例化過程中運行。

Button addBtn = (Button) findViewById(R.id.add_btn); 

但是,在創建對象時,視圖還沒有創建。所以,findViewById不會找到任何東西,並會返回null。因此,該CRASH(或強制關閉)將發生。

解決方案

因此,確保添加findViewById()一個視圖已經創建後調用方法中(否則,它會永遠找不到的觀點)。如你所見,我建議在setContentView(R.layout.activity_edited)之後添加onCreate()方法(它負責將對象添加到VIEW中)。

在那一行之後,findViewById()將能夠找到視圖(當然,如果您將它們添加到佈局中)。

+0

謝謝!這似乎是做伎倆:) – anita

1

刪除解決此代碼括號

{ 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

應該是這樣的

Button addBtn = (Button) findViewById(R.id.add_btn); 
addBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     saveListInfo(); 
    } 
}); 

如果你想知道爲什麼事故發生,你可以閱讀更多關於What is an initialization block?