Що саме робити 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 не передається повідомлення для запуску аудіо потоку.
З іншого боку, якщо ви не кинете виняток, мені не буде з чого починати працювати, крім: "Дурна програма не відтворює жодної музики"; Хоча це і не так погано , як явне приховування помилок , таких , як на самому ділі ковтанням виняток , яке було насправді кинули , ви все ще потенційно витрачати час чуже , коли що - то піде не так ... так бути красиво і кинути виняток на них.