在 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?

QT与C程序的调用

按键精灵UI界面的实例代码以及调用

Qt ObjectName()必须是唯一的吗?

Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在祝方法调用,后者必须先实例化后用实例调用)

C函数中如何调用未实例化类的成员函数