我有一个实现Runnable
的Audioplayer。它会启动声音并在之后终止。这是一种常见的做法,还是我应该自己将其关闭,就像在最后一种方法中一样,目前尚未使用。在我看来,让它终止并强制关闭其余部分是一个好主意。
public class AudioPlayer implements Runnable {
AudioInputStream audioIn;
Clip clip;
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
clip.start();
}
public void close() throws IOException {
try {
clip.close();
audioIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
在undefined
方法中打开流并在finally子句中关闭它们,或者实现run()
以便您的类可以用作资源。
答案 1 :(得分:1)
直接回答你的问题:不,这不是常见的练习,而是不好的做法!
一般来说,获取资源并不明确释放资源是不好的做法。特别是对于流 - 可能有文件句柄,各种各样的东西。打开它们然后扔掉它们可能会起作用;但正如所说:只是不好的做法。并注意:对于任何旨在运行更长时间的程序......它不仅仅是好的"要释放资源,这是绝对的必须。
特别是当人们认为Java 7几年前引入了try-with-resources时。
答案 2 :(得分:0)
我建议在使用后释放内存/资源,为此,存在finally
块:
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
但是,如果您的音频流在完成后自动关闭,则不需要强制关闭,如果不是错误:
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
close();
}
}
答案 3 :(得分:0)
请注意:要确保清理所有内容,您可能需要将其编写为:
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}