Я обнаружил, что этот вопрос был помечен как дубликат одного о том, как предотвратить исключения нулевого указателя. Для пояснения проблема в том, что библиотека его выбрасывает. Моя переменная не равна нулю. Подробнее c Справка о библиотеке более полезна.
Я создаю приложение для игры в музыку c. Я пытаюсь использовать класс MediaController для добавления элементов управления к воспроизводимой песне. Однако, когда я запускаю функцию .show()
, я получаю исключение нулевого указателя.
Вот код для MediaController:
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
MediaController timer = view.findViewById(R.id.song_progress);
timer.setMediaPlayer(new MediaController.MediaPlayerControl() {
@Override
public void start() {
MainActivity.playingSong.start();
}
@Override
public void pause() {
MainActivity.playingSong.pause();
}
@Override
public int getDuration() {
return MainActivity.playingSong.getDuration();
}
@Override
public int getCurrentPosition() {
return MainActivity.playingSong.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
MainActivity.playingSong.seekTo(pos);
}
@Override
public boolean isPlaying() {
return MainActivity.playingSong.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return MainActivity.playingSong.getAudioSessionId();
}
});
timer.setAnchorView(view);
timer.setEnabled(true);
timer.show();
}
Вот журнал ошибок:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.luner.mobilemusic, PID: 2021
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.measure(int, int)' on a null object reference
at android.widget.MediaController.updateFloatingWindowLayout(MediaController.java:173)
at android.widget.MediaController.show(MediaController.java:363)
at android.widget.MediaController.show(MediaController.java:314)
at com.luner.mobilemusic.Playlist$Song$PlayFragment.onViewCreated(Playlist.java:271)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7156)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
Почему это происходит? Есть ли хороший способ исправить это, или я должен использовать другой класс полностью? Я был бы очень признателен за любые примеры кода, которые у вас могут быть.
Кроме того, я обнаружил, что удаление setAnchorView(view)
предотвращает ошибку, но затем не вызывает MediaController.
Редактировать
После более тщательного поиска я обнаружил две вещи:
Номера строк по какой-то причине не точны; строка для updateFloatingWindowLayout
появилась внутри другого метода.
Виновной является переменная mDecor
, которая при запуске метода setAnchorView
устанавливается в переменную представления. Однако переменная представления не может быть null
, так как это вызвало бы исключение перед тем, как перейти к функции show
. Таким образом, я все еще не могу выяснить источник этого ... переменная mDecor должна где-то быть установлена на null
, но только когда я добавляю пользовательское представление привязки.