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

Android Studio中Intent传递Activity数据触发空指针异常问题

解决Intent传递数据及NullPointerException问题

首先,你的NullPointerException出现在listView.getItemAtPosition(position).toString()这一行,主要原因有两个:

  1. listView.getItemAtPosition(position)可能返回null(比如ListView的adapter绑定有延迟,或者数据初始化顺序存在隐藏问题)
  2. 你的BaiHat类没有重写toString()方法,即使获取到对象,默认的toString()也不会返回你需要的歌曲名称。

另外,你的SecondActivity里也存在几处逻辑错误,我会一并修复。


第一步:修复MainActivity的点击事件

直接使用你已经初始化好的baiHatArrayList来获取点击的对象,这比从ListView取更可靠,同时正确获取歌曲名称:

修改MainActivity的onItemClick方法:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 直接从列表中获取点击的歌曲对象
        BaiHat clickedSong = baiHatArrayList.get(position);
        // 获取正确的歌曲名称
        String ten_bai_hat = clickedSong.getTenBaiHat();
        
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        // 传递Parcelable类型的列表
        intent.putParcelableArrayListExtra("BAIHAT", baiHatArrayList);
        intent.putExtra("TENBAIHAT", ten_bai_hat);
        intent.putExtra("POSITION", position);
        
        startActivity(intent);
    }
});

第二步:修复SecondActivity的逻辑错误

你的SecondActivity存在两个关键问题:

  • 先使用默认的vi_tri=0获取列表数据,再从intent中读取正确的position,顺序颠倒
  • 使用Uri.parse(baiHatArrayList.get(vi_tri).toString())初始化MediaPlayer完全错误,因为BaiHat的toString()不是Uri,应该直接使用资源id

修改后的SecondActivity代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    
    txtlaydulieu = findViewById(R.id.textViewlaydulieu);
    Intent intent = getIntent();
    
    // 先获取点击的位置,再处理其他数据
    vi_tri = intent.getIntExtra("POSITION", 0);
    // 获取传递过来的歌曲列表
    baiHatArrayList = intent.getParcelableArrayListExtra("BAIHAT");
    
    // 获取歌曲名称(可以选择从intent取,或者从列表中取,后者更可靠)
    String songName = intent.getStringExtra("TENBAIHAT");
    // 可选:从列表中直接获取,避免字符串传递的潜在问题
    // String songName = baiHatArrayList.get(vi_tri).getTenBaiHat();
    
    txtlaydulieu.setText(songName);
    txtlaydulieu.setSelected(true);
    
    // 获取音频资源的id,直接传给MediaPlayer
    int audioResId = baiHatArrayList.get(vi_tri).getTenFile();
    MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), audioResId);
    mediaPlayer.start();
}

可选优化:给BaiHat类重写toString()

如果你以后需要直接打印或者在ListView中显示BaiHat对象的名称,可以给BaiHat类添加toString()方法:

@Override
public String toString() {
    return tenBaiHat;
}

这样修改后,你的NullPointerException问题会被解决,同时SecondActivity的音频播放也能正常工作。

内容的提问来源于stack exchange,提问作者nguyen van thang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:47:47