Co dokładnie zrobić MediaPlayer.play()
i MediaPlayer.stop()
zrobić - są one zdarzeń słuchaczy do danych wprowadzonych przez użytkownika lub są oni faktycznie metody, które rozpoczynają jakiegoś strumienia mediów w systemie? Jeśli są tylko słuchaczami wprowadzanymi przez użytkownika, to jest całkowicie rozsądne, aby nic nie robili (chociaż dobrym pomysłem byłoby ich gdzieś zalogować). Jednakże, jeżeli mają one wpływ na modelu Twój UI kontroluje, a następnie mogli rzucać IllegalStateException
ponieważ gracz powinien mieć jakiś isPlaying=true
lub isPlaying=false
stan (to nie musi być rzeczywisty Boolean flagę jak napisane tutaj), a więc, gdy dzwonisz MediaPlayer.stop()
, kiedy isPlaying=false
The metoda nie może faktycznie „zatrzymać”, MediaPlayer
ponieważ obiekt nie jest w odpowiednim stanie do zatrzymania - zobacz opisjava.lang.IllegalStateException
klasa:
Sygnalizuje, że metoda została wywołana w nielegalnym lub nieodpowiednim czasie. Innymi słowy, środowisko Java lub aplikacja Java nie jest w odpowiednim stanie dla żądanej operacji.
Dlaczego wprowadzanie wyjątków może być dobre
Wydaje się, że wiele osób uważa, że wyjątki są złe, ponieważ nigdy nie należy ich rzucać (por. Joel w sprawie oprogramowania ). Powiedzmy jednak, że masz MediaPlayerGUI.notifyPlayButton()
wywoływanie MediaPlayer.play()
, które MediaPlayer.play()
wywołuje wiele innych kodów i gdzieś poniżej łączy się z np. PulseAudio , ale ja (programista) nie wiem, gdzie, ponieważ nie napisałem całego tego kodu.
Pewnego dnia podczas pracy nad kodem klikam „zagraj” i nic się nie dzieje. Jeśli MediaPlayerGUIController.notifyPlayButton()
coś loguje, przynajmniej mogę zajrzeć do logów i sprawdzić, czy kliknięcie przycisku zostało zarejestrowane ... ale dlaczego nie gra? Powiedzmy, że coś jest nie tak z opakowaniami PulseAudio, które MediaPlayer.play()
wywołują. Ponownie klikam przycisk „Odtwórz” i tym razem otrzymuję 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)
Patrząc na ślad stosu, mogę zignorować wszystko przed MediaPlayer.play()
debugowaniem i poświęcić czas na zastanawianie się, dlaczego np. Nie jest przekazywana wiadomość do PulseAudio w celu uruchomienia strumienia audio.
Z drugiej strony, jeśli nie wyrzucisz wyjątku, nie będę miał nic do pracy poza: „Głupi program nie odtwarza żadnej muzyki”; Chociaż nie jest tak zły, jak jawne ukrywanie błędów, takie jak faktyczne połykanie wyjątku, który został faktycznie zgłoszony , wciąż potencjalnie marnujesz czas innych, gdy coś pójdzie nie tak ... więc bądź miły i rzuć im wyjątek.