Java 启动意图时出现空指针异常

Java 启动意图时出现空指针异常,java,android,nullpointerexception,Java,Android,Nullpointerexception,我是一个android的初学者,正在尝试自己制作一个简单的应用程序。我试着发布尽可能多的代码细节 当我在MainActivity.java中单击ShowTask按钮时,它不会启动新的Intent并抛出NullPointerException。如果我删除了setOnClickListener以及TaskList.java中与其相关的代码,新的意图将启动,但按钮将不起作用。我已经张贴了日志,以使它容易 MainActivity.java package com.budthapa.unsavedcha

我是一个android的初学者,正在尝试自己制作一个简单的应用程序。我试着发布尽可能多的代码细节

当我在
MainActivity.java
中单击ShowTask按钮时,它不会启动新的Intent并抛出
NullPointerException
。如果我删除了
setOnClickListener
以及
TaskList.java
中与其相关的代码,新的意图将启动,但按钮将不起作用。我已经张贴了日志,以使它容易

MainActivity.java

package com.budthapa.unsavedchanges;

import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private Button addTask;
    private Button cancel;
    private EditText editText;
    private Button showTask;

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

        addTask.setOnClickListener(this);
        showTask.setOnClickListener(this);
        cancel.setOnClickListener(this);

    }

    private void initialize() {
        addTask = (Button) findViewById(R.id.btnAddTask);
        showTask = (Button) findViewById(R.id.btnShowTask);
        cancel = (Button) findViewById(R.id.btnCancel);
        editText = (EditText) findViewById(R.id.editText);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View arg0) {
        String text = editText.getText().toString();

        // cancel button works only if textbox is not empty
        switch (arg0.getId()) {
        case R.id.btnAddTask:
            // call method that add tasks
            if (text.isEmpty()) {
                // if no content in the textbox
                Toast showMessage = Toast.makeText(MainActivity.this,
                        "Please fill some task to add", Toast.LENGTH_LONG);
                showMessage.setGravity(Gravity.CENTER, 0, 0);
                showMessage.show();
            } else {
                addTask();
            }
            break;

        case R.id.btnShowTask:
            // It will start a new activity to show the list of task
            Intent showTaskList = new Intent(MainActivity.this, TaskList.class);
            startActivity(showTaskList);
            break;
        case R.id.btnCancel:
            // call this method when user creates cancel button
            if (!text.isEmpty()) {
                // there is some content in the text box
                unSavedDialog();
                break;

            }
            // you can call this code instead, but will not so any warning
            // finish();
            exitAppDialog(); // this code will show alert dialog box
        }
    }

    private void addTask() {
        // add new item to the array list
        String taskName = editText.getText().toString();
        ArrayList<String> taskArr = new ArrayList<String>();
        taskArr.add(taskName);
        // notify user that new task is added
        Toast addNewTask = Toast.makeText(MainActivity.this,
                "New Task Added successfully", Toast.LENGTH_SHORT);
        addNewTask.setGravity(Gravity.CENTER, 0, 0);
        addNewTask.show();
    }

    private void exitAppDialog() {
        // this method will start when user clicks cancel button
        AlertDialog.Builder exitDialog = new AlertDialog.Builder(this);
        exitDialog.setTitle(R.string.exitApp);
        exitDialog.setMessage(R.string.exitMessage);
        exitDialog.setCancelable(false);

        exitDialog.setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        // exit the app
                        finish();
                    }
                });
        exitDialog.setNegativeButton("No",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int arg1) {
                        // cancel and return to the app
                        dialog.cancel();
                    }
                });
        AlertDialog alert = exitDialog.create();
        alert.show();
    }

    private void unSavedDialog() {
        // this dialog will appear when user press cancel button
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle(R.string.alertTitle);
        alert.setMessage(R.string.alertMessage);
        alert.setCancelable(false);

        alert.setNegativeButton("Add Task",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        // save the task and exit
                        addTask();
                    }
                });

        alert.setPositiveButton("Discard Changes",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        // finish the activity
                        finish();
                    }
                });

        alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // cancel the dialog box and return to the view
                arg0.cancel();
            }
        });

        AlertDialog dialog = alert.create();
        dialog.show();
    }
}
package com.budthapa.unsavedchanges;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TaskList extends Activity implements OnClickListener {
    private Button addNewTask;
    private Button cancel;
    private TextView taskList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.task_list);
        initialize();

        addNewTask.setOnClickListener(this);
        cancel.setOnClickListener(this);
    }

    private void initialize() {
        // TODO Auto-generated method stub
        addNewTask = (Button) findViewById(R.id.btnAddTask);
        cancel = (Button) findViewById(R.id.btnCancel);
        taskList = (TextView) findViewById(R.id.textView);
    }

    public void showTask() {

    }

    @Override
    public void onClick(View arg0) {
        switch (arg0.getId()) {
        case R.id.btnCancel:
            AlertDialog.Builder alert = new AlertDialog.Builder(TaskList.this);
            alert.setTitle("Do you want to exit?");
            alert.setCancelable(false);
            alert.setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            finish();
                        }
                    });

            alert.setNegativeButton("No",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            arg0.cancel();
                        }
                    });

            AlertDialog dialog = alert.create();
            dialog.show();
            break;

        case R.id.btnAddTask:
            Intent showMain = new Intent(TaskList.this, MainActivity.class);
            startActivity(showMain);

            finish(); // finish the current running activity and go back to main
                        // Activity
            break;
        }
    }
}
试试这个

有两个相同的基站

addNewTask = (Button) findViewById(R.id.btnAddTask);
cancel = (Button) findViewById(R.id.btnCancel);
任务列表类

task_list.xml没有
btnAddTask
这就是为什么会出现此错误

您需要为不同活动的不同名称提供xml btn id

case R.id.btnCancel:
            // call this method when user creates cancel button
            if (!text.isEmpty()) {

                unSavedDialog();
                break;

            }

            exitAppDialog(); // this code will show alert dialog box
         break;   <------- MISSING......
        }
    }
案例R.id.btnCancel:
//当用户创建“取消”按钮时调用此方法
如果(!text.isEmpty()){
未保存的对话框();
打破
}
exitAppDialog();//此代码将显示警报对话框

打破请发布日志。@Selvin E/AndroidRuntime(11060):致命异常:main E/AndroidRuntime(11060):java.lang.RuntimeException:无法启动活动组件信息{com.budthapa.unsavedchanges/com.budthapa.unsavedchanges.TaskList}:java.lang.NullPointerException E/AndroidRuntime(11060):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)E/AndroidRuntime(11060):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)E/AndroidRuntime(11060):在android.app.ActivityThread.access$600(ActivityThread.java:141)这个“case”是“switch()上的最后一个“case”,所以这不会有效果,但是,如果这些ID不存在,那就不会导致编译器错误?@angel_navarro btnAddTask已经存在于activity_main.xml中,那么btnAddTask不能将该名称命名为other activity.xml,如果它给出,它将使NPE.ah ok@Tamilan,than用于您的澄清;-)感谢它的帮助。实际上,我在想是否可以使用相同的按钮。@budthapa不,我们需要为不同的活动使用不同的id名称。这是一个链接,我们为这样的布局提供了不同的名称。。