【问题标题】:Causedby:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter' on a null object reference [duplicate]Causedby:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.ListView.setAdapter”[重复]
【发布时间】:2020-08-26 04:38:21
【问题描述】:

DisplayActivity.java

我对 android 比较陌生。我正在尝试制作一个包含音乐的列表视图。该应用程序已完美构建,但是当我尝试在设备上运行它时它崩溃了。我尝试调试该应用程序和它给了我上述错误。这是我的以下代码

package com.bytetex.azmusic;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;

import java.io.File;
import java.util.ArrayList;

public class DisplayActivity extends AppCompatActivity {

    private String[] itemsAll;
    private ListView mSongsLists;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display);
        appExternalStorageStoragePermission();
        mSongsLists=findViewById(R.id.songLists);
    }

    public void appExternalStorageStoragePermission() {
        Dexter.withContext(this)
                .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse response) {
                        dispalyAudioSongName();

                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse response) {

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                        token.continuePermissionRequest();

                    }
                }).check();
    }

    public ArrayList<File> readOnluAudioSongs(File file) {
        ArrayList<File> arrayList = new ArrayList<>();
        File[] allFiles = file.listFiles();
        assert allFiles != null;
        for (File individualFile : allFiles) {
            if (individualFile.isDirectory() && !individualFile.isHidden()) {
                arrayList.addAll(readOnluAudioSongs(individualFile));
            } else {
                if (individualFile.getName().endsWith(".mp3") || individualFile.getName().endsWith(".aac") || individualFile.getName().endsWith(".wav") || individualFile.getName().endsWith(".wma")) {
                    {
                        arrayList.add(individualFile);
                    }
                }
            }

        }
        return arrayList;
    }
    private void dispalyAudioSongName()
    {
        final ArrayList<File> audioSong= readOnluAudioSongs(Environment.getExternalStorageDirectory());
        itemsAll=new String[audioSong.size()];
        for (int songCounter=0; songCounter<audioSong.size(); songCounter++)
        {
            itemsAll[songCounter]=audioSong.get(songCounter).getName();
        }
        ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(DisplayActivity.this, android.R.layout.simple_list_item_1, itemsAll);
        mSongsLists.setAdapter(arrayAdapter);
    }
}

activity_display.xml

这是我的 xml 代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DisplayActivity">

    <ListView
        android:id="@+id/songLists"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</ListView>


</RelativeLayout>


【问题讨论】:

    标签: java android android-studio debugging nullpointerexception


    【解决方案1】:

    在 dispalyAudioSongName() 方法中对“mSongsLists”调用 setAdapter() 方法之前,已声明 mSongsLists 变量但从未使用值初始化。

    在 onCreate() 方法中,您正在调用 appExternalStorageStoragePermission(),它在内部调用 dispalyAudioSongName(),此时 mSongsLists 为空。

        private ListView mSongsLists; // declaration of mSongsLists with defaultvalue for an object( null in java)        
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_display);
         appExternalStorageStoragePermission(); // dispalyAudioSongName() invoked internally which tries to set adapter on mSongsLists causing nullpointer exception
         mSongsLists=findViewById(R.id.songLists); //mSongsLists variable is assigned a value at this point and prior to this it is null
        }
    
        private void dispalyAudioSongName(){
         final ArrayList<File> audioSong=  readOnluAudioSongs(Environment.getExternalStorageDirectory());
         itemsAll=new String[audioSong.size()];
         for (int songCounter=0; songCounter<audioSong.size(); songCounter++)
         {
            itemsAll[songCounter]=audioSong.get(songCounter).getName();
         }
         ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(DisplayActivity.this, android.R.layout.simple_list_item_1, itemsAll);
         mSongsLists.setAdapter(arrayAdapter); // <---nullpointer exception
        }
    

    要解决此问题,您可以先设置“mSongsLists”,然后调用 appExternalStorageStoragePermission() 方法。

        @Override
        protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_display);
         mSongsLists=findViewById(R.id.songLists); //set the value first
         appExternalStorageStoragePermission(); // invoke the method second
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多