2016-09-04 4 views
1

AutoCloseableインターフェイスの定義によって、
ALLのインスタンスに対してclose()を呼び出す必要があります。
つまり、このように書く必要があります。 java.sound.sampled.SourceDataLineインタフェースでLineインターフェイスでは、すべてのインスタンスに対してclose()を呼び出す必要があります。

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


またはより一般的に、java.sound.sampled.Lineインタフェースで、
それはALLインスタンスのclose()
を呼び出すために必要なまたは私はopen()を呼びかけているclose()後にのみ呼び出す必要がありますか?

公式文書は、明示的に、私はcloseisOpened
が、私はこのように書きたくなければならない場合にのみ、と述べている場合。 しかし、私は言及を見つけることができませんでした。

//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 
} 
+0

try-with-resourcesはコードをきれいにするために考案されたもので、さらに複雑にするものではありません。 – tkausl

答えて

0

あなたの実際の質問があるべき「それは?データラインが開かれていない場合close()を呼び出すために害を与えない」とあなたは、単にjavax.sound.sampled.Lineが持っている

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

注意を使用できるように答えが、「いいえ」でありますJava 7で意図的に変更されてAutoCloseableに拡張されました。その目的は、リソースがtry-with-resourceステートメント内で使用されるようにすることです。

1

あなたは事を考えすぎているようです。

Java 1.7以前のバージョンと同じように、try-with-resourcesというリソースは存在せず、コードを書き留めてください。確かに

、あなたのようなもので終わる:

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

はトライして、リソース、単にそれに応じてこの例を減らすことができます。

言い換えれば、try-with-resourcesでは、tryブロック内で使用される1つ(またはそれ以上)のリソースを定義できます。それは、最後にとさせていただきます。 in:tryおよびtry ...のために宣言されたリソースはすべて閉じられます。

具体的には、他のあなたのリソースのインスタンスについて考えないでください。あなたが現在対処しているに注目してください。

関連する問題