Apa yang sebenarnya dilakukan MediaPlayer.play()
dan MediaPlayer.stop()
dilakukan? - apakah mereka pendengar acara untuk input pengguna atau apakah mereka benar-benar metode yang memulai semacam aliran media pada sistem? Jika mereka adalah pendengar untuk input pengguna, maka sangat masuk akal bagi mereka untuk tidak melakukan apa-apa (walaupun itu ide yang baik untuk setidaknya mencatatnya di suatu tempat). Namun, jika mereka memengaruhi model yang dikontrol UI Anda, maka mereka dapat melempar IllegalStateException
karena pemain harus memiliki semacam isPlaying=true
atau isPlaying=false
keadaan (tidak harus berupa bendera Boolean yang sebenarnya seperti yang ditulis di sini), dan ketika Anda menelepon MediaPlayer.stop()
kapan isPlaying=false
, Metode tidak dapat benar - benar "menghentikan" itu MediaPlayer
karena objek tidak dalam keadaan yang tepat untuk dihentikan - lihat deskripsijava.lang.IllegalStateException
kelas:
Tanda-tanda bahwa suatu metode telah dipanggil pada waktu yang ilegal atau tidak pantas. Dengan kata lain, lingkungan Java atau aplikasi Java tidak dalam kondisi yang sesuai untuk operasi yang diminta.
Mengapa melempar pengecualian bisa bagus
Banyak orang tampaknya berpikir bahwa pengecualian pada umumnya buruk, karena mereka tidak boleh dibuang (lih. Joel tentang Perangkat Lunak ). Namun, katakan Anda memiliki MediaPlayerGUI.notifyPlayButton()
panggilan mana MediaPlayer.play()
, dan MediaPlayer.play()
memanggil banyak kode lain dan di suatu tempat di garis itu berinteraksi dengan misalnya PulseAudio , tetapi saya (pengembang) tidak tahu di mana karena saya tidak menulis semua kode itu.
Kemudian, suatu hari saat mengerjakan kode, saya klik "main" dan tidak ada yang terjadi. Jika MediaPlayerGUIController.notifyPlayButton()
mencatat sesuatu, setidaknya saya dapat melihat log dan memeriksa apakah klik tombol itu benar-benar terdaftar ... tetapi mengapa itu tidak diputar? Nah, katakanlah sebenarnya ada sesuatu yang salah dengan bungkus PulseAudio yang MediaPlayer.play()
memanggil. Saya klik tombol "play" lagi, dan kali ini saya mendapat 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)
Dengan melihat jejak stack itu, saya dapat mengabaikan semuanya sebelum MediaPlayer.play()
saat debugging dan menghabiskan waktu saya mencari tahu mengapa misalnya tidak ada pesan yang diteruskan ke PulseAudio untuk memulai aliran audio.
Di sisi lain, jika Anda tidak melempar pengecualian, saya tidak akan memiliki apa pun untuk mulai bekerja selain: "Program bodoh tidak memainkan musik apa pun"; Meskipun tidak seburuk eksplisit kesalahan bersembunyi seperti benar-benar menelan pengecualian yang telah sebenarnya dilemparkan , Anda masih berpotensi membuang-buang waktu orang lain ketika ada sesuatu yang salah ... jadi bagus dan melemparkan sebuah pengecualian pada mereka.