O que exatamente fazem MediaPlayer.play()
e MediaPlayer.stop()
fazem? - são ouvintes de eventos para entrada do usuário ou são realmente métodos que iniciam algum tipo de fluxo de mídia no sistema? Se tudo o que são são ouvintes para a entrada do usuário, é perfeitamente razoável que eles não façam nada (embora seja uma boa ideia, pelo menos, registrá-los em algum lugar). No entanto, se eles afetarem o modelo que sua interface do usuário está controlando, eles poderão lançar um IllegalStateException
porque o jogador deve ter algum tipo de isPlaying=true
ou isPlaying=false
estado (não precisa ser um sinalizador booleano real, como está escrito aqui) e, portanto, quando você chama MediaPlayer.stop()
quando isPlaying=false
, o O método não pode realmente "parar" o MediaPlayer
porque o objeto não está no estado apropriado a ser parado - veja a descrição dojava.lang.IllegalStateException
classe:
Sinais de que um método foi chamado em um momento ilegal ou inadequado. Em outras palavras, o ambiente Java ou o aplicativo Java não está em um estado apropriado para a operação solicitada.
Por que lançar exceções pode ser bom
Muitas pessoas parecem pensar que as exceções são ruins em geral, pois nunca devem ser lançadas (cf. Joel on Software ). No entanto, digamos que você tenha uma MediaPlayerGUI.notifyPlayButton()
chamada MediaPlayer.play()
e MediaPlayer.play()
invoque vários outros códigos e em algum ponto abaixo da interface com a qual ele faz interface, por exemplo , o PulseAudio , mas eu (o desenvolvedor) não sei onde, porque não escrevi todo esse código.
Então, um dia, enquanto trabalhava no código, clico em "play" e nada acontece. Se MediaPlayerGUIController.notifyPlayButton()
registrar algo, pelo menos eu posso olhar para os registros e verificar se o clique do botão foi realmente registrado ... mas por que não é reproduzido? Bem, digamos que há algo errado com os invólucros PulseAudio que são MediaPlayer.play()
invocados. Clico no botão "reproduzir" novamente e desta vez recebo um 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)
Observando esse rastreamento de pilha, posso ignorar tudo antes MediaPlayer.play()
durante a depuração e dedicar meu tempo a descobrir por que, por exemplo, nenhuma mensagem está sendo passada ao PulseAudio para iniciar um fluxo de áudio.
Por outro lado, se você não der uma exceção, não terei nada para começar a trabalhar além de: "O programa estúpido não toca música"; Embora não seja tão ruim quanto ocultar erros explícitos , como realmente engolir uma exceção que foi de fato lançada , você ainda está potencialmente desperdiçando o tempo dos outros quando algo der errado ... então seja gentil e jogue uma exceção neles.