Android中两个Activity间传递类实例时出现空指针异常求助
解决Android Serializable传递对象时的空指针异常问题
我帮你找出了导致第二个Activity空指针异常的两个关键问题,咱们一步步拆解并修正:
问题1:没有把Serializable对象传入Intent中
你在SerializeMethod里创建了Bundle并放入了PhoneBookEntry对象,但没有把这个Bundle添加到Intent里,也没有直接把对象放入Intent。这就导致第二个Activity调用getSerializableExtra时拿到的是null,自然会触发空指针异常。
问题2:错误获取EditText的输入文本
你用了name.toString()来获取用户输入的内容,这其实是返回EditText控件本身的字符串描述(比如android.widget.EditText@abc123),而不是用户输入的文本。正确的做法是调用getText().toString()来获取输入内容。
修正后的MainActivity代码
public class MainActivity extends Activity { EditText name, phone, type; Button addBtn; public final static String SER_KEY = "com.easyinfogeek.objectPass.ser"; public final static String Tag = "Yes"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addBtn = findViewById(R.id.button); addBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SerializeMethod(); } }); } public void SerializeMethod(){ name = findViewById(R.id.name); phone = findViewById(R.id.phone); type = findViewById(R.id.type); PhoneBookEntry book = new PhoneBookEntry(); // 修正:获取用户输入的正确方式 book.setName(name.getText().toString()); book.setPhone(phone.getText().toString()); book.setType(type.getText().toString()); Intent intent = new Intent(this, SecondActivity.class); // 方式一:直接将Serializable对象放入Intent intent.putExtra(SER_KEY, book); // 如果你想用Bundle,需要把Bundle添加到Intent中(二选一即可) // Bundle bundle = new Bundle(); // bundle.putSerializable(SER_KEY, book); // intent.putExtras(bundle); startActivity(intent); } }
更安全的SecondActivity代码(增加空判断)
为了避免后续可能的空指针,建议在获取对象后先做null判断:
public class SecondActivity extends Activity { final public static String Tag = "Yes"; TextView txt1, txt2, txt3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); txt1 = findViewById(R.id.textView1); txt2 = findViewById(R.id.textView2); txt3 = findViewById(R.id.textView3); PhoneBookEntry book = (PhoneBookEntry) getIntent().getSerializableExtra(MainActivity.SER_KEY); // 增加null判断,防止空指针 if(book != null){ txt1.setText(book.getName()); txt2.setText(book.getPhone()); txt3.setText(book.getType()); } else { txt1.setText("未获取到数据"); } } }
确认PhoneBookEntry的getters/setters正确
确保你的实体类有完整且正确的getter和setter方法:
public class PhoneBookEntry implements Serializable { private static final long serialVersionUID = -7060210544600464481L; private String name; private String phone; private String type; // Getters public String getName() { return name; } public String getPhone() { return phone; } public String getType() { return type; } // Setters public void setName(String name) { this.name = name; } public void setPhone(String phone) { this.phone = phone; } public void setType(String type) { this.type = type; } }
内容的提问来源于stack exchange,提问作者M.P.
相关产品推荐
相关产品推荐

