无法启动 activity:java.lang.ArrayIndexOutOfBoundsException

Unable to start activity: java.lang.ArrayIndexOutOfBoundsException

大家好! 朋友们,当你点击按钮时,一个新的 activity 并没有启动。发生以下异常:java.lang.ArrayIndexOutOfBoundsException。 我的错误日志如下所示:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.projectMP3, PID: 3228
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.projectMP3/com.example.projectMP3.Activity.PlayerActivity}: java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2400)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2458)
        at android.app.ActivityThread.access0(ActivityThread.java:172)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5598)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
        at java.util.ArrayList.get(ArrayList.java:310)
        at com.example.projectMP3.Activity.PlayerActivity.getIntentMethod(PlayerActivity.java:167)
        at com.example.projectMP3.Activity.PlayerActivity.onCreate(PlayerActivity.java:62)
        at android.app.Activity.performCreate(Activity.java:5459)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2458) 
        at android.app.ActivityThread.access0(ActivityThread.java:172) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:146) 
        at android.app.ActivityThread.main(ActivityThread.java:5598) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
        at dalvik.system.NativeStart.main(Native Method) 

MainActivity.java

的程序代码
public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
 //....
 private void int_viewPager() {

        ViewPager viewPager;
        TabLayout tabLayout;
        FloatingActionButton openMusicPlayer;
        //...
        androidx.appcompat.widget.Toolbar toolbar;
        viewPager = findViewById(R.id.view_Pager);
        tabLayout = findViewById(R.id.tab_layout);
        //...
        viewPager.setAdapter(viewPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);

        openMusicPlayer = findViewById(R.id.open_Music);
        openMusicPlayer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, PlayerActivity.class);
                startActivity(intent);
            }
        });

    }
}

PlayerActivity.java的程序代码:

//...
public class PlayerActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener {
   
    /** Логические переменные (случайное воспроизведение, повтор аудиозаписи) */
    static boolean shuffleBoolean = false, repeatBoolean;
    /** Список музыкальных композиций */
    ArrayList<MusicFile> listSong = new ArrayList<>();
    /** Специальный идентификатор */
    Uri uri;
    /** Обработчик потока - обновляет сведения о времени */
    Handler handler = new Handler();
    /** Потоки воспроизведения */
    Thread playThread, prevThread, nextThread;

    private int position = -1;
    private FloatingActionButton playPause;
    //...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Размещает пользовательский интерфейс на экране активности
        setContentView(R.layout.activity_player);
        // Инициализирует элементы управления
        initView();
        // Получает данные из Intent
        getIntentMethod();

        /* Добавляем listener, который получит
        *  уведомление, когда проигрывание закончится. */
        mediaPlayer.setOnCompletionListener(this);

        //...

        // Перемещение функциональности в фоновый режим
        PlayerActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
               //...
        });  
    }

  
    /** Получает данные из намерения (Intent) */
    private void getIntentMethod() {
        /* Получаем данные, добавленные ранее
        *  с помощью putExtra() */
        position = getIntent().getIntExtra("position", -1);
        String sender =  getIntent().getStringExtra("Sender");

        if(sender!= null && sender.equals("albumDetails")) {
            listSong = album_Music;
        } else {
            listSong = musicFilesSongAdapter;
        }

        if (listSong != null) {
            playPause.setImageResource(R.drawable.ic_pause);
            uri = Uri.parse(listSong.get(position).getPath());
        }

        if (mediaPlayer != null) {
            mediaPlayer.stop();
            // Освобождаем приобретенные ресурсы (память, кодеки)
            mediaPlayer.release();
        }
        mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        mediaPlayer.start();
        songSeekBar.setMax(mediaPlayer.getDuration() / 1000);
        metaData(uri);
    }

    // Получаем метаданные (альбом и др.)
    private void metaData(Uri uri) {
       //...
    }
 
    private void prevThreadBtn() {
        prevThread = new Thread() {
            @Override
            public void run() {
                super.run();
                playPrev.setOnClickListener(v -> prevBtnClicked());
            }
        };
        prevThread.start();
    }

    /** Обрабатывает нажатие кнопки (Play previous)*/
    private void prevBtnClicked() {
        if (mediaPlayer.isPlaying()) {
            /* Останавливаем воспроизведение,
            * освобождаем ресурсы, связанные с этим объектом */
            mediaPlayer.stop();
            mediaPlayer.release();

            /* Проверяем, включены ли режимы Shuffle, Repeat */
            if (shuffleBoolean && !repeatBoolean) {
                position = getRandom(listSong.size() - 1);
            } else if (!shuffleBoolean && !repeatBoolean) {
                position = ((position - 1) < 0 ? (listSong.size() - 1) : (position - 1));
            }

            uri = Uri.parse(listSong.get(position).getPath());
            // Создаем MediaPlayer для заданного URI
            mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
            // Устанавливаем метаданные
            metaData(uri);
            //...
  }

    /** Вызывается после возобновления активности
     *  (after onResume() has been called) */
    @Override
    protected void onPostResume() {
        playThreadBtn();
        prevThreadBtn();
        nextThreadBtn();
        super.onPostResume();
    }


    /** Получает ссылки элементов управления */
    private void initView() {
        songName = findViewById(R.id.song_name);
        durationPlayed = findViewById(R.id.duration_played);
        totalDuration = findViewById(R.id.duration_total);
        //...
    }

   
    @Override
    public void onCompletion(MediaPlayer mp) {
       //...
    }
}

如果我没理解错,那么错误就在下面几行:

if (listSong != null) {
            playPause.setImageResource(R.drawable.ic_pause);
            uri = Uri.parse(listSong.get(position).getPath());
        }

但是...我不知道如何解决这个错误。你能帮忙吗?

因为你的位置是-1,你必须检查

if(position != -1)
    uri = Uri.parse(listSong.get(position).getPath());

开始时你没有发送位置activity

Intent intent = new Intent(MainActivity.this, PlayerActivity.class);
startActivity(intent);
private int position = -1;

这导致您的 ArrayIndexOutOfBound