在 Line 接口中,我必须为所有实例调用 close() ,还是仅在 Line 打开时调用?

In Line interface, I must call close() for all instance, or only when Line is opened?

根据AutoCloseable接口的定义,
我必须为 ALL 个实例调用 close()
即我必须这样写。

try(A a = new A()){
    //do something
}

java.sound.sampled.SourceDataLine界面中,
或者更常见的是,在 java.sound.sampled.Line 界面中,
是否需要为 ALL 个实例调用 close()
或者我必须在 open() 调用后才调用 close()

如果官方文档明确说我必须close只有当isOpened时,
我想这样写。 但我找不到提及。

//can I write like this ?  

SourceDataLine sdl;
try{
    sdl = AudioSystem.getSourceDataLine(audioFormat);
    sdl.open(audioFormat,bufferSize);
}catch(LineUnavailableException ex){
    throw new RuntimeException(null,ex);
}
try(SourceDataLine sdlInTryWithResources = sdl){
    //do something
}  

看来你想多了

Just image try-with-resources 将不存在并写下您的代码,就像您在 Java 1.7.

之前所做的那样

当然,你最终会得到这样的结果:

Whatever somethingThatNeedsClosing = null;
try {
  somethingThatNeedsClosing = ...
  somethingThatNeedsClosing.whatever();
} catch (NoIdeaException e) {
  error handling
} finally {
  if (somethingThatNeedsClosing != null) {
    somethingThatNeedsClosing.close()
  }
}

Try-with-resources 仅允许您相应地减少此示例。

换句话说:try-with-resources 允许您定义将在 try 块中使用的一个(或多个)资源;这将 最终 关闭。如:为 try ... 声明的每个资源和任何资源都将被关闭。

更具体地说:不要考虑资源的 other 个实例。专注于您当前正在处理的一个

你的实际问题应该是“在数据线没打开的情况下调用close()有害吗?”答案是否定的,所以你可以简单地使用

try(SourceDataLine sdl = AudioSystem.getSourceDataLine(audioFormat)) {
    sdl.open(audioFormat, bufferSize);
    // work with sdl
}
catch(LineUnavailableException ex) {
    throw new RuntimeException(ex);
}

请注意,javax.sound.sampled.Line 已在 Java 7 中有意更改为扩展 AutoCloseable,其唯一目的是允许在 try-with-resource 语句中使用资源.