Tam olarak ne yapar MediaPlayer.play()
ve MediaPlayer.stop()
yaparlar? - kullanıcı girişi için olay dinleyicileri mi yoksa sistemde bir çeşit medya akışını başlatan yöntemler mi? Eğer hepsi kullanıcı girişi için dinleyici ise, o zaman hiçbir şey yapmamaları mantıklıdır (en azından bir yerde oturum açmak iyi bir fikir olacaktır). Onlar etkileyen Ancak, modeli UI kontrol ediyor, sonra da bir atabilseydin IllegalStateException
oyuncu bazı tür olmalıdır, çünkü isPlaying=true
ya isPlaying=false
devlet (burada yazılı gibi gerçek bir Boole bayrağı olması gerekmez) ve böylece Aradığınızda MediaPlayer.stop()
zaman isPlaying=false
, yöntemi aslında "durduramaz" MediaPlayer
çünkü nesne durdurulacak uygun durumda değildir -java.lang.IllegalStateException
sınıf:
Bir yöntemin yasa dışı veya uygunsuz bir zamanda çağrıldığını gösterir. Başka bir deyişle, Java ortamı veya Java uygulaması istenen işlem için uygun durumda değil.
İstisnaları atmak neden iyi olabilir?
Birçok insan, istisnaların genel olarak kötü olduğunu düşünüyor gibi görünüyor, çünkü asla atılmamalıdır (bkz. Joel on Software ). Bununla birlikte, bir MediaPlayerGUI.notifyPlayButton()
çağrıya sahip olduğunuzu MediaPlayer.play()
ve MediaPlayer.play()
diğer kodların bir demetini ve örneğin PulseAudio ile arayüz oluşturduğu çizginin bir kısmını çağırdığını varsayalım , ancak ben (geliştirici) nerede bilmiyorum çünkü tüm bu kodu yazmadım.
Sonra, bir gün kod üzerinde çalışırken, "play" i tıklıyorum ve hiçbir şey olmuyor. Bir MediaPlayerGUIController.notifyPlayButton()
şey kaydederse, en azından günlüklere bakabilir ve düğme tıklamasının gerçekten kayıtlı olup olmadığını kontrol edebilirim ... ama neden oynamıyor? Peki, aslında çağrı yapan PulseAudio sarmalayıcılarında bir sorun var diyelim MediaPlayer.play()
. Tekrar "oynat" düğmesini tıklıyorum ve bu sefer şunu alıyorum 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)
Bu yığın izlemesine bakarak, MediaPlayer.play()
hata ayıklamadan önce her şeyi göz ardı edebilir ve zamanımı örneğin ses akışı başlatmak için PulseAudio'ya hiçbir mesajın geçmediğini anlayarak harcayabilirim.
Eğer Öte yandan, yok bir istisna, ben başka ile çalışmaya başlamak için hiçbir şey gerekir: "aptal programı herhangi bir müzik çalmıyor"; Her ne kadar değil açık kadar kötü hata gizleme gibi aslında istisna yutma oldu aslında atılmış , yine potansiyel olarak bir şey go yanlış yapar başkalarının zamanını böyle mi ... öylesine güzel ve onlara bir özel durum.