Que font-ils MediaPlayer.play()
et MediaPlayer.stop()
font-ils exactement ? - sont-ils des écouteurs d' événements pour la saisie des utilisateurs ou sont-ils en fait des méthodes qui démarrent une sorte de flux multimédia sur le système? Si tout ce qu'ils sont sont des écouteurs pour les entrées des utilisateurs, alors il est parfaitement raisonnable qu'ils ne fassent rien (bien que ce soit une bonne idée de les enregistrer au moins quelque part). Cependant, s'ils affectent le modèle contrôlé par votre interface utilisateur, ils pourraient lancer un IllegalStateException
car le joueur devrait avoir une sorte d' état isPlaying=true
ou isPlaying=false
(ce ne doit pas être un drapeau booléen réel comme écrit ici), et donc lorsque vous appelez MediaPlayer.stop()
quand isPlaying=false
, le La méthode ne peut pas réellement "arrêter" le MediaPlayer
car l'objet n'est pas dans l'état approprié pour être arrêté - voir la description dujava.lang.IllegalStateException
classe:
Signale qu'une méthode a été invoquée à un moment illégal ou inapproprié. En d'autres termes, l'environnement Java ou l'application Java n'est pas dans un état approprié pour l'opération demandée.
Pourquoi lever des exceptions peut être bon
Beaucoup de gens semblent penser que les exceptions sont mauvaises en général, car elles ne devraient jamais être levées (cf. Joel sur le logiciel ). Cependant, supposons que vous ayez un MediaPlayerGUI.notifyPlayButton()
qui appelle MediaPlayer.play()
, et MediaPlayer.play()
invoque un tas d'autres codes et quelque part sur la ligne avec laquelle il s'interface, par exemple PulseAudio , mais moi (le développeur) ne sais pas où parce que je n'ai pas écrit tout ce code.
Puis, un jour en travaillant sur le code, je clique sur "play" et rien ne se passe. Si MediaPlayerGUIController.notifyPlayButton()
je note quelque chose, au moins je peux regarder dans les journaux et vérifier que le clic sur le bouton a bien été enregistré ... mais pourquoi ne joue-t-il pas? Eh bien, disons qu'il y a en fait quelque chose de mal avec les wrappers PulseAudio qui MediaPlayer.play()
invoque. Je clique à nouveau sur le bouton "jouer", et cette fois je reçois 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)
En regardant cette trace de pile, je peux tout ignorer avant de MediaPlayer.play()
déboguer et passer mon temps à comprendre pourquoi, par exemple, aucun message n'est transmis à PulseAudio pour démarrer un flux audio.
D'un autre côté, si vous ne lancez pas d'exception, je n'aurai rien pour commencer à travailler avec autre que: "Le programme stupide ne joue aucune musique"; Bien que ce ne soit pas aussi mauvais qu'une erreur explicite se cachant , comme avaler une exception qui a en fait été levée , vous perdez quand même potentiellement le temps des autres quand quelque chose ne va pas ... alors soyez gentil et lancez-leur une exception.