¿Qué hacen MediaPlayer.play()
y MediaPlayer.stop()
qué hacen exactamente ? ¿Son oyentes de eventos para la entrada del usuario o son realmente métodos que inician algún tipo de flujo de medios en el sistema? Si todos ellos son oyentes para la entrada del usuario, entonces es perfectamente razonable que no hagan nada (aunque sería una buena idea al menos registrarlos en algún lugar). Sin embargo, si afectan a la modelo de la interfaz de usuario es el control, entonces se podría lanzar una IllegalStateException
porque el jugador debe tener algún tipo de isPlaying=true
o isPlaying=false
estado (que no tiene por qué ser un indicador booleano real como escrito aquí), y por lo tanto cuando se llama MediaPlayer.stop()
cuando isPlaying=false
, el el método no puede realmente "detener" el MediaPlayer
porque el objeto no está en el estado apropiado para detenerse - vea la descripción deljava.lang.IllegalStateException
clase:
Señala que se ha invocado un método en un momento ilegal o inapropiado. En otras palabras, el entorno Java o la aplicación Java no está en un estado apropiado para la operación solicitada.
Por qué lanzar excepciones puede ser bueno
Mucha gente parece pensar que las excepciones son malas en general, ya que nunca deberían lanzarse (cf. Joel en Software ). Sin embargo, digamos que tiene un MediaPlayerGUI.notifyPlayButton()
que llama MediaPlayer.play()
e MediaPlayer.play()
invoca un montón de otro código y en algún punto de la línea con la que interactúa, por ejemplo , PulseAudio , pero yo (el desarrollador) no sé dónde porque no escribí todo ese código.
Luego, un día, mientras trabajaba en el código, hago clic en "reproducir" y no sucede nada. Si MediaPlayerGUIController.notifyPlayButton()
registra algo, al menos puedo mirar en los registros y comprobar que el clic del botón estaba registrado ... pero ¿por qué no se reproduce? Bueno, digamos que de hecho hay algo mal con los envoltorios PulseAudio que MediaPlayer.play()
invoca. Vuelvo a hacer clic en el botón "reproducir" y esta vez obtengo un 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)
Al observar ese seguimiento de la pila, puedo ignorar todo antes MediaPlayer.play()
cuando depuro y pasar mi tiempo descubriendo por qué, por ejemplo, no se pasa ningún mensaje a PulseAudio para iniciar una transmisión de audio.
Por otro lado, si no lanzas una excepción, no tendré nada con lo que comenzar a trabajar aparte de: "El estúpido programa no reproduce música"; Aunque no es tan malo como ocultar un error explícito , como tragar realmente una excepción que , de hecho , se produjo , todavía está potencialmente perdiendo el tiempo de otros cuando algo sale mal ... así que sea amable y proponles una excepción.