Что именно делают MediaPlayer.play()
и MediaPlayer.stop()
делают? - они слушатели событий для пользовательского ввода или они на самом деле методы, которые запускают какой-то поток медиа в системе? Если все они являются слушателями пользовательского ввода, то для них совершенно разумно ничего не делать (хотя было бы неплохо хотя бы зарегистрировать их где-нибудь). Однако, если они влияют на модель, которой управляет ваш пользовательский интерфейс, они могут выдать, IllegalStateException
потому что у игрока должно быть какое-то состояние isPlaying=true
или isPlaying=false
состояние (это не должен быть фактический логический флаг, как написано здесь), и поэтому, когда вы вызываете MediaPlayer.stop()
когда isPlaying=false
, метод не может на самом деле «остановить», MediaPlayer
потому что объект не находится в соответствующем состоянии для остановки - см. описаниеjava.lang.IllegalStateException
учебный класс:
Сигналы о том, что метод был вызван в недопустимое или неподходящее время. Другими словами, среда Java или приложение Java не находятся в надлежащем состоянии для запрошенной операции.
Почему бросать исключения может быть хорошо
Многие люди, кажется, думают, что исключения в целом плохие, так как они никогда не должны быть выброшены (см. Джоэл по программному обеспечению ). Однако, скажем, у вас есть метод, MediaPlayerGUI.notifyPlayButton()
который вызывает MediaPlayer.play()
, и MediaPlayer.play()
вызывает кучу другого кода и где-то вниз по линии, с которой он взаимодействует, например, PulseAudio , но я (разработчик) не знаю, где, потому что я не писал весь этот код.
Затем, однажды, работая над кодом, я нажимаю «играть», и ничего не происходит. Если MediaPlayerGUIController.notifyPlayButton()
что-то регистрируется, по крайней мере, я могу просмотреть журналы и убедиться, что нажатие кнопки действительно было зарегистрировано ... но почему оно не воспроизводится? Ну, скажем, на самом деле что-то не так с обертками PulseAudio, которые MediaPlayer.play()
вызывают. Я снова нажимаю кнопку «играть», и на этот раз я получаю IllegalStateException
:
Exception in thread "main" java.lang.IllegalStateException: MediaPlayer already in play state.
at org.superdupermediaplayer.MediaPlayer.play(MediaPlayer.java:16)
at org.superdupermediaplayer.gui.MediaPlayerGUIController.notifyPlayButton(MediaPlayerGUIController.java:25)
at org.superdupermediaplayer.gui.MediaPlayerGUI.main(MediaPlayerGUI.java:14)
Просматривая эту трассировку стека, я могу игнорировать все ранее MediaPlayer.play()
при отладке и тратить свое время на выяснение того, почему, например, в PulseAudio не передается сообщение для запуска аудиопотока.
С другой стороны, если вы не выбросите исключение, мне не за что будет работать, кроме: «Глупая программа не воспроизводит музыку»; Хотя это и не так плохо , как явное сокрытие ошибок , таких , как на самом деле глотанием исключение , которое было на самом деле бросили , вы все еще потенциально тратить время чужое , когда что - то пойдет не так ... так быть красиво и бросить исключение на них.