Was genau tun MediaPlayer.play()
und MediaPlayer.stop()
tun? - Sind sie Ereignis- Listener für Benutzereingaben oder sind sie tatsächlich Methoden, die eine Art Medienstrom auf dem System starten? Wenn alles, was sie sind, Listener für Benutzereingaben sind, ist es für sie völlig vernünftig, nichts zu tun (obwohl es eine gute Idee wäre, sie zumindest irgendwo zu protokollieren). Wenn sie jedoch die Auswirkungen auf Modell UI steuert, dann könnten sie einen werfen , IllegalStateException
weil der Spieler eine Art haben sollte isPlaying=true
oder isPlaying=false
Zustand (es muss nicht eine tatsächliche Boolesche Flag wie hier geschrieben sein), und so , wenn Sie anrufen , MediaPlayer.stop()
wenn isPlaying=false
die Diese Methode kann MediaPlayer
das Objekt nicht "stoppen", da es sich nicht in dem zu stoppenden Zustand befindet - siehe Beschreibung desjava.lang.IllegalStateException
Klasse:
Signalisiert, dass eine Methode zu einem unzulässigen oder unangemessenen Zeitpunkt aufgerufen wurde. Mit anderen Worten, die Java-Umgebung oder Java-Anwendung befindet sich nicht in einem für die angeforderte Operation geeigneten Zustand.
Warum es gut sein kann, Ausnahmen zu werfen
Viele Leute scheinen zu glauben, dass Ausnahmen generell schlecht sind, da sie niemals geworfen werden sollten (vgl. Joel on Software ). Nehmen wir jedoch an, Sie haben einen MediaPlayerGUI.notifyPlayButton()
which-Aufruf MediaPlayer.play()
und MediaPlayer.play()
rufen eine Reihe anderen Codes auf, der irgendwo in der Folge mit z. B. PulseAudio zusammenarbeitet , aber ich (der Entwickler) weiß nicht, wo, weil ich nicht den gesamten Code geschrieben habe.
Dann, eines Tages, während ich am Code arbeite, klicke ich auf "Abspielen" und nichts passiert. Wenn MediaPlayerGUIController.notifyPlayButton()
etwas protokolliert wird, kann ich zumindest in den Protokollen nachsehen, ob der Tastenklick tatsächlich registriert wurde ... aber warum wird er nicht abgespielt? Angenommen, mit den PulseAudio-Wrappern stimmt tatsächlich etwas nicht MediaPlayer.play()
. Ich klicke erneut auf den "Play" -Button und diesmal erhalte ich eine 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)
Wenn ich mir diesen Stack-Trace ansehe, kann ich MediaPlayer.play()
beim Debuggen alles ignorieren und herausfinden, warum z. B. keine Nachricht an PulseAudio gesendet wird, um einen Audiostream zu starten.
Auf der anderen Seite, wenn Sie keine Ausnahme machen, habe ich nichts anderes zu tun als: "Das blöde Programm spielt keine Musik ab"; Obwohl es nicht so schlimm , wie explizite Fehler versteckt , wie eigentlich eine Ausnahme beim Schlucken , das war in der Tat geworfen , ich ist immer noch potentiell andere Zeit zu verschwenden , wenn etwas schief gehen tut ... so schön, und eine Ausnahme auf sie werfen.