有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

起因:java。lang.NullPointerException:尝试调用虚拟方法“void”。小装置。列表视图。空对象引用上的setAdapter

显示活动。爪哇

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

package com.bytetex.azmusic;

import 安卓x.appcompat.app.AppCompatActivity;

import 安卓.Manifest;
import 安卓.os.Bundle;
import 安卓.os.Environment;
import 安卓.widget.ArrayAdapter;
import 安卓.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, 安卓.R.layout.simple_list_item_1, itemsAll);
        mSongsLists.setAdapter(arrayAdapter);
    }
}

活动显示。xml

这是我的xml代码

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

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


</RelativeLayout>



共 (1) 个答案

  1. # 1 楼答案

    在dispalyAudioSongName()方法中调用“mSongsLists”上的setAdapter()方法之前,mSongsLists变量已声明,但从未与值关联

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

        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
        }