정확히 무엇을 MediaPlayer.play()
하고 MediaPlayer.stop()
수행합니까?- 사용자 입력을위한 이벤트 리스너 입니까, 아니면 실제로 시스템에서 일종의 미디어 스트림을 시작하는 방법입니까? 이들이 모두 사용자 입력을위한 청취자라면 아무 것도하지 않는 것이 합리적입니다 (적어도 어딘가에 기록하는 것이 좋습니다). 그들이 영향을 미치는 경우, 모델 당신의 UI가 제어되어, 그들은은을 던질 수있는 IllegalStateException
선수가 몇 가지의 종류가 있어야하기 때문에 isPlaying=true
또는 isPlaying=false
상태 (이 여기에 기록 된 같은 실제 부울 플래그를 할 필요가 없다), 그래서 당신이 호출 할 때 MediaPlayer.stop()
경우 isPlaying=false
의 MediaPlayer
객체가 중지 될 적절한 상태에 있지 않으므로 메소드가 실제로 "중지"할 수 없습니다 .java.lang.IllegalStateException
수업:
불법적이거나 부적절한 시간에 메소드가 호출되었음을 나타냅니다. 즉, Java 환경 또는 Java 응용 프로그램이 요청 된 작업에 적합한 상태가 아닙니다.
예외를 던지는 것이 좋은 이유
많은 사람들은 예외가 발생해서는 안되는 것처럼 일반적으로 예외가 나쁘다고 생각하는 것 같습니다 (참조 : Joel on Software ). 그러나 당신이이 말을 MediaPlayerGUI.notifyPlayButton()
하는 전화 MediaPlayer.play()
및 MediaPlayer.play()
원용하는 다른 코드는 예와 인터페이스 어딘가에 선을 아래 한 무리의 펄스 오디오를 ,하지만 난 모든 코드가 작성하지 않았기 때문에 I (개발자)는 어디 모른다.
그런 다음 어느 날 코드 작업을하는 동안 "재생"을 클릭하면 아무 일도 일어나지 않습니다. MediaPlayerGUIController.notifyPlayButton()
뭔가를 기록 하면 적어도 로그를 살펴보고 버튼 클릭이 실제로 등록되었는지 확인할 수 있지만 왜 재생되지 않습니까? 실제로 PulseAudio 래퍼에 문제가 있다고 가정 해보십시오 MediaPlayer.play()
. "재생"버튼을 다시 클릭하면 이번에는 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)
스택 추적을 보면 MediaPlayer.play()
디버깅 하기 전에 모든 것을 무시 하고 오디오 스트림을 시작하기 위해 PulseAudio로 메시지가 전달되지 않는 이유를 알아내는 데 시간을 할애 할 수 있습니다 .
반면에, 예외를 던지지 않는다면 , "어리석은 프로그램은 어떤 음악도 연주하지 않습니다."; 비록하지 명시 적으로 나쁜 같은 오류 숨기기 등 실제로 예외 삼키는 된 사실에 던져 , 당신은 여전히 잠재적으로 뭔가 이동 잘못을하지 다른 사람의 시간을 낭비를 ... 너무 좋은 그들에 예외를 throw합니다.