Java使用一个剪辑和一个Try-with-resources块,结果没有声音

Java使用一个剪辑和一个Try-with-resources块,结果没有声音,java,audio,javasound,clip,try-with-resources,Java,Audio,Javasound,Clip,Try With Resources,我正在为我的学校项目改写我的AudioManager课程,我遇到了一个问题。我的教授告诉我用Try-with-resources块来加载所有资源,而不是使用Try/catch(见下面的代码)。我使用的是javax.sound.sampled.Clip中的Clip类,所有内容都与我的PlaySound(String path)方法完美配合,该方法使用try/catch/if我不关闭()剪辑。我知道如果我合上夹子,我就不能再使用它了。我已经阅读了Oracle文档中的Clip,并尝试使用资源,但我找不

我正在为我的学校项目改写我的AudioManager课程,我遇到了一个问题。我的教授告诉我用Try-with-resources块来加载所有资源,而不是使用Try/catch(见下面的代码)。我使用的是javax.sound.sampled.Clip中的Clip类,所有内容都与我的PlaySound(String path)方法完美配合,该方法使用try/catch/if我不关闭()剪辑。我知道如果我合上夹子,我就不能再使用它了。我已经阅读了Oracle文档中的Clip,并尝试使用资源,但我找不到解决方案。所以我想知道的是:

在剪辑关闭之前,是否可以使用“尝试使用”资源块播放/收听剪辑中的声音

// Uses Try- with resources. This does not work.
public static void playSound(String path) {
try {
    URL url = AudioTestManager.class.getResource(path);
    try (Clip clip = AudioSystem.getClip()){
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();
    }
} catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) {
    e.printStackTrace();}
}

// Does not use Try- with resources. This works.

public static void playSound2(String path) {
Clip clip = null;
try {
    URL url = AudioTestManager.class.getResource(path);
    clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();

}
catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) {
    e.printStackTrace();}
finally {
   // if (clip != null) clip.close();
}
}

提前谢谢

问题是
try with resources
块将在块完成时自动关闭在其中创建的
剪辑
,导致播放停止

在另一个示例中,由于没有手动关闭,因此可以继续播放

如果要在播放结束后关闭
剪辑
,可以使用
addLineListener()
向其添加
LineListener
,并在收到
停止
事件时关闭它,如下所示:

final Clip clip = AudioSystem.getClip();
// Configure clip: clip.open();
clip.start();

clip.addLineListener(new LineListener() {
    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP)
            clip.close();
    }
});

谢谢你的快速评论!但是有可能延迟close()操作吗?我试过Thread.sleep(有时),它播放了声音,但它也停止了游戏Thread.Edited。添加了在剪辑结束时关闭它的正确方法。谢谢,所以没有方法使用“与资源一起尝试”吗?坦率地说,我宁愿使用像你这样的解决方案,但因为我的教授说我们将尽可能多地使用我们所有的资源,所以在我决定不使用它之前,我想真正确定一下。Thanks@Towni0该剪辑在单独的线程上播放,因此您不能使用try-with-resources。如果您的教授建议以这种方式使用带有剪辑的try-with-resources,那么它们是错误的。总的来说,使用资源进行尝试是一种很好的风格,但在这里不起作用。好的,谢谢你们两位