Chính xác thì làm gì MediaPlayer.play()
và MediaPlayer.stop()
làm gì? - chúng có phải là trình lắng nghe sự kiện cho đầu vào của người dùng hay chúng thực sự là các phương thức bắt đầu một số luồng phương tiện trên hệ thống? Nếu tất cả họ là người nghe cho đầu vào của người dùng, thì họ hoàn toàn không làm gì cả (mặc dù đó ít nhất là một ý tưởng tốt để đăng nhập chúng ở đâu đó). Tuy nhiên, nếu chúng ảnh hưởng đến mô hình mà UI của bạn đang điều khiển, thì họ có thể ném IllegalStateException
vì người chơi nên có một số loại isPlaying=true
hoặc isPlaying=false
trạng thái (nó không cần phải là cờ Boolean thực sự như được viết ở đây), và vì vậy khi bạn gọi MediaPlayer.stop()
khi nào isPlaying=false
, phương thức thực sự không thể "dừng" MediaPlayer
vì đối tượng không ở trạng thái thích hợp bị dừng - xem mô tả vềjava.lang.IllegalStateException
lớp học:
Tín hiệu cho thấy một phương thức đã được gọi vào thời điểm bất hợp pháp hoặc không phù hợp. Nói cách khác, môi trường Java hoặc ứng dụng Java không ở trạng thái thích hợp cho hoạt động được yêu cầu.
Tại sao ném ngoại lệ có thể là tốt
Rất nhiều người dường như nghĩ rằng các ngoại lệ nói chung là xấu, vì trong đó họ không bao giờ nên bị ném (xem Joel trên Phần mềm ). Tuy nhiên, giả sử bạn có một MediaPlayerGUI.notifyPlayButton()
cuộc gọi MediaPlayer.play()
và MediaPlayer.play()
gọi một loạt các mã khác và ở đâu đó trong dòng giao diện với nó, ví dụ PulseAudio , nhưng tôi (nhà phát triển) không biết nơi nào vì tôi không viết tất cả mã đó.
Sau đó, một ngày trong khi làm việc với mã, tôi bấm "phát" và không có gì xảy ra. Nếu MediaPlayerGUIController.notifyPlayButton()
ghi nhật ký một cái gì đó, ít nhất tôi có thể nhìn vào nhật ký và kiểm tra xem nút bấm trên thực tế đã được đăng ký chưa ... nhưng tại sao nó không phát? Chà, thực tế là có gì đó không ổn với trình bao bọc PulseAudio MediaPlayer.play()
gọi. Tôi nhấp vào nút "phát" lần nữa và lần này tôi nhận được 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)
Bằng cách nhìn vào dấu vết ngăn xếp đó, tôi có thể bỏ qua mọi thứ trước MediaPlayer.play()
khi gỡ lỗi và dành thời gian để tìm hiểu lý do tại sao ví dụ như không có tin nhắn nào được chuyển đến PulseAudio để bắt đầu một luồng âm thanh.
Mặt khác, nếu bạn không đưa ra một ngoại lệ, tôi sẽ không có gì để bắt đầu làm việc ngoài việc: "Chương trình ngu ngốc không phát bất kỳ bản nhạc nào"; Mặc dù không phải là xấu như rõ ràng ẩn lỗi như thực sự nuốt một ngoại lệ mà đã được trên thực tế ném , bạn vẫn có khả năng lãng phí thời gian của người khác khi có điều gì làm sai đi ... vì vậy hãy thoải mái và ném một ngoại lệ vào họ.