简体   繁体   中英

Getting java.lang.NullPointerException: Attempt to get length of null array error

I am trying to create a music player app in Android studio but I am getting the java.lang.NullPointerException: Attempt to get length of null array errors. Below is the code attached. I am using compliesdk version 30.0.2 since my version 31 was corrupted.

Mainactivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = findViewById(R.id.listViewSong);

    runtimePermission();


}

public void runtimePermission()
{
    Dexter.withContext(this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                    displaySongs();
                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                }

                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                    permissionToken.continuePermissionRequest();
                }
            }).check();
}

public ArrayList<File> findSong (File file)
{
    ArrayList<File> arrayList = new ArrayList<>();

    File[] files = file.listFiles();

    for (File singlefile: files)
    {
        if (singlefile.isDirectory() && !singlefile.isHidden())
        {
            arrayList.addAll(findSong(singlefile));
        }
        else
        {
            if(singlefile.getName().endsWith(".mp3") || singlefile.getName().endsWith(".wav"))
            {
                arrayList.add(singlefile);
            }
        }
    }

    return arrayList;
}


void displaySongs()
{
    final ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory());

    items = new String[mySongs.size()];
    for (int i = 0;i<mySongs.size();i++)
    {
        items[i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav" , "");

    }
    ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items);
    listView.setAdapter(myAdapter);
}

}

Androidmanifest.xml:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

<application
    android:allowBackup="true"
    android:requestLegacyExternalStorage="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.TASAMusicPlayer">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Logcat:

2021-10-21 20:41:46.328 27622-27622/com.tanban.tasamusicplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tanban.tasamusicplayer, PID: 27622
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tanban.tasamusicplayer/com.tanban.tasamusicplayer.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.NullPointerException: Attempt to get length of null array
    at com.tanban.tasamusicplayer.MainActivity.findSong(MainActivity.java:65)
    at com.tanban.tasamusicplayer.MainActivity.findSong(MainActivity.java:69)
    at com.tanban.tasamusicplayer.MainActivity.findSong(MainActivity.java:69)
    at com.tanban.tasamusicplayer.MainActivity.displaySongs(MainActivity.java:86)
    at com.tanban.tasamusicplayer.MainActivity$1.onPermissionGranted(MainActivity.java:44)
    at com.karumi.dexter.MultiplePermissionsListenerToPermissionListenerAdapter.onPermissionsChecked(Unknown Source:35)
    at com.karumi.dexter.DexterInstance$1.run(Unknown Source:43)
    at com.karumi.dexter.MainThread.execute(Unknown Source:6)
    at com.karumi.dexter.DexterInstance.checkMultiplePermissions(Unknown Source:71)
    at com.karumi.dexter.DexterInstance.checkPermissions(Unknown Source:0)
    at com.karumi.dexter.Dexter.check(Unknown Source:10)
    at com.tanban.tasamusicplayer.MainActivity.runtimePermission(MainActivity.java:56)
    at com.tanban.tasamusicplayer.MainActivity.onCreate(MainActivity.java:33)
    at android.app.Activity.performCreate(Activity.java:8000)
    at android.app.Activity.performCreate(Activity.java:7984)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

Update: So I changed my findSong function to this

Fixed:

public ArrayList<File> findSong(File file) {
    ArrayList arrayList = new ArrayList();
    File [] files = file.listFiles();
    if(files != null) {
        for (File singlefile : files) {
            if (singlefile.isDirectory() && !singlefile.isHidden()) {
                arrayList.addAll(findSong(singlefile));
            } else {
                if (singlefile.getName().endsWith(".wav")) {
                    arrayList.add(singlefile);
                } else if (singlefile.getName().endsWith(".mp3")) {
                    arrayList.add(singlefile);
                }
            }

        }
    }

File.listFiles may return null (not a clever design).

File[] files = file.listFiles();
if (files != null) {
    for (File singlefile: files) {
        if (singlefile.isDirectory() && !singlefile.isHidden()) {
            arrayList.addAll(findSong(singlefile));
        } else if( singlefile.getName().endsWith(".mp3") || 
                singlefile.getName().endsWith(".wav")) {
            arrayList.add(singlefile);
        }
    }
}

By doing a few changes to my findSong function this error was fixed thanks for help

public ArrayList<File> findSong(File file) {
        ArrayList arrayList = new ArrayList();
        File [] files = file.listFiles();
        if(files != null) {
            for (File singlefile : files) {
                if (singlefile.isDirectory() && !singlefile.isHidden()) {
                    arrayList.addAll(findSong(singlefile));
                } else {
                    if (singlefile.getName().endsWith(".wav")) {
                        arrayList.add(singlefile);
                    } else if (singlefile.getName().endsWith(".mp3")) {
                        arrayList.add(singlefile);
                    }
                }

            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM