2016-08-21 8 views
1

私はこれを理解する方法がわからない:finally {if(inputStream!= null){inputStream.close();

{ 
     if (inputStream **!= null**) { 
      inputStream.close(); 

をその例から:すべてのデータが提供されている場合

public class CopyLines { 
public static void main(String[] args) throws IOException { 

    BufferedReader inputStream = null; 
    PrintWriter outputStream = null; 

    try { 
     inputStream = new BufferedReader(new FileReader("xanadu.txt")); 
     outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); 

     String l; 
     while ((l = inputStream.readLine()) != null) { 
      outputStream.println(l); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 
}} 

のinputStreamを閉じたbeeingてさ?

+0

'if-statement 'は' NullPointerException'を回避することです。 – garnulf

+0

Javaのどのバージョンですか?これは1.7より前のコード – fge

+0

のようです。Javaのドキュメントhttps://docs.oracle.com/javase/tutorial/essential/io/charstreams.html – DarekK

答えて

3

それは、それはfinallyブロック内のストリーム(inputStreamoutputStream)を閉鎖しようとしますが、BufferedReaderまたはPrintWriterのインスタンスを作成中tryブロックとして失敗する可能性があります(成功したかどうか)tryブロックが終了するたびにことを意味しnullでなければ最初にチェックする必要があります。そうしないと、NPEを取得します。

をチェックしてコードを簡略化するように明示的にclose()を呼び出す必要がないように、try-with-resoucesステートメントの使用を検討することができます。

try (BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt")); 
    PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt")) { 
    // your code here 
} 
+0

からのものです。 Javaのドキュメントによると、readline()は行を読み込み、\ n(またはこのメソッドに適切なもの)で終わっていれば、メソッドは読み込みを停止し、 'null'を返すので、JVMはこのプロセスを処理します正しくリソースリークは発生しませんか?行の読み取り中にいくつかの入出力エラーが発生し、読み込みが正常に終了していない可能性があります。 – DarekK

+0

私はあなたが何を意味するのかは分かりませんが、実際にストリームが閉じてリークを防ぐことができます。 –

+0

readLine()がどのように正確に動作しているかを理解しようとしています。 によると、corectlyでreadline()が終了したかどうかはわかりませんが、読み込まれた行末インジケータがある場合、nullで終了します。これはJVMに解析されるか、JVMに解析されるnullです。行が読み込まれていないEOFがあります。 – DarekK

0

nullポインタの例外を避けるためです。関数は、オブジェクトがnullでない場合にのみ呼び出されます。オブジェクトが他のヌルでないときは、NULL値を持つオブジェクトにclose()を呼び出す場合、簡単な言葉で

は、close機能のみ呼ばれ、あなたはnull pointer exceptionに遭遇します。

finallyの使用法は例外であるかどうかにかかわらず常に呼び出されます。

0

実行がfinallyブロックに到達すると、最初にinputstreamoutputstreamがヌルであるかどうかがチェックされ、両方のストリームが閉じられてリソースが解放されます。

について、最終的にしようと確認するためにリンクを参照してください:このコードは、その後、finallyブロックである理由https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.2

+0

try/finallyは私にとっては明らかです。ありがとう。 – DarekK

1

は、あなたが求めている場合は、

これは確実にするために、単純であることinputStreamoutputStreamます上記のコードが遭遇するかどうかにかかわらず、例外が発生しても常にクローズされます。

どう違うのですか?

違いは例外です。何らかの例外が発生した場合、単に返すのではなく、このメソッドを呼び出したメソッドに例外を返す前に、両方のストリームが閉じられていることを確認します。Javaのfinallyブロックbacause

が常に実行されて、いない限り:

  • またはJVMが
  • がクラッシュと呼ばれる

    • System.exitこれは、ストリーム、データベースをクローズするのが一般的ですまたはfinallyブロックの他の同様の接続を使用します。これにより、接続が常に閉じられることが保証されます。なぜなら、最終的にブロックされておらず、システムが継続的にいくつかのまたは他のものに遭遇しているからである。Excpetionそれは結局接続が不足するからである。

    +0

    いいえ、私は最終的にブロックに興味がありません。 '!= null'だけ私に興味があります。 – DarekK

    関連する問題