在 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 语句中使用资源.
根据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 语句中使用资源.