在 Line 界面中,我必须为所有实例调用 close() ,还是仅在 Line 打开时调用?
Posted
技术标签:
【中文标题】在 Line 界面中,我必须为所有实例调用 close() ,还是仅在 Line 打开时调用?【英文标题】:In Line interface, I must call close() for all instance, or only when Line is opened? 【发布时间】:2016-09-04 06:04:55 【问题描述】:通过AutoCloseable
接口的定义,
对于所有个实例,我必须致电close()
。
即我必须这样写。
try(A a = new A())
//do something
在java.sound.sampled.SourceDataLine
界面,
或者更常见的是,在java.sound.sampled.Line
界面中,ALL 实例是否需要调用 close()
,
或者我必须打电话给close()
只有在 open()
打电话之后?
如果官方文档明确规定我必须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
【问题讨论】:
try-with-resources 的发明是为了稍微清理你的代码,而不是让它变得更复杂...... 【参考方案1】:您的实际问题应该是“在数据线未打开时拨打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 语句中使用资源。
【讨论】:
【参考方案2】:看来你是想多了。
将不存在仅图像 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 ... 声明的每个资源都将被关闭。
更具体地说:不要考虑资源的其他个实例。专注于您当前正在处理的一个。
【讨论】:
以上是关于在 Line 界面中,我必须为所有实例调用 close() ,还是仅在 Line 打开时调用?的主要内容,如果未能解决你的问题,请参考以下文章
我如何用JAVA调用存储过程取得 serveroutput?
Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在祝方法调用,后者必须先实例化后用实例调用)