【问题标题】:To Do app crash待办事项应用程序崩溃
【发布时间】:2016-02-12 15:11:23
【问题描述】:

我正在尝试在 android studio 中制作一个待办事项应用程序。但是,只要我单击添加按钮(右上角的 +),应用程序就会崩溃。我对 java 和 android studio 很陌生,但我认为问题可能在于“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: 致命异常: main 进程:com.carpe_diem.anitas_todolist,PID:1410 java.lang.RuntimeException:无法实例化活动 组件信息{com.carpe_diem.anitas_todolist/com.carpe_diem.anitas_todolist.EditedActivity}: java.lang.NullPointerException:尝试调用虚拟方法 'android.view.View android.view.Window.findViewById(int)' 为空 对象引用 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.NullPointerException:尝试调用虚拟 方法'android.view.View android.view.Window.findViewById(int)' 空对象引用 在 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) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 我想知道为什么这个问题被关闭为重复只是因为表明“NullPointerException”

标签: java android xml android-studio


【解决方案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() 将能够找到视图(当然,如果您将它们添加到布局中)。

【讨论】:

    【解决方案2】:

    去掉这段代码的括号

    {
        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?

    【讨论】:

      猜你喜欢
      • 2020-09-02
      • 2019-01-31
      • 2017-06-07
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多