You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:40