JavaA2Z

KAB-studio > プログラミング > JavaA2Z > closeとは

close

日本語 閉じる
英語 close
ふりがな くろーず
フリガナ クローズ

解説

「閉じる」という一般的な英単語。
狭義においては「close()メソッド」を指す。
ストリームクラス等、多くのクラスにおいて「終了処理」をうためのメソッドとして定義されている。
 
ファイルやネットワーク等、処理の終了時に「終了処理」が必要な処理は多い。
だが、Javaではガベージコレクションの関係で、その終了処理を自動的に呼ぶことができない。
Javaインスタンス寿命は、ガベージコレクションが消した時に訪れ、それはいつわれるのか決まっていない。
プログラム上は、そのインスタンス参照する参照変数スコープから外れて寿命が来ることでインスタンス参照が失われ、インスタンスを操作できなくなるが、インスタンスそのものは依然残っている。
参照変数が消える際「何らかのメソッドを自動的に呼ぶ」という機能はJavaにはない。あったとしても、ひとつのインスタンスを複数の参照変数参照できるため、その参照が消えた時にそのメソッドが呼ばれるのか明確には分からないという問題がある。
よって、Javaでは「変数インスタンスが消えたときにメソッドが呼ばれる」という機能は存在しない。そのため、終了処理は必ず使用した側がう必要があり、明示的にclose()メソッドを呼ぶ必要があるわけである。
 
close()メソッドは多くの場合「必ず呼び出さなければならない」ため、通常はfinallyブロック内でう。
また、close()メソッド呼び出すための参照変数スコープの関係上tryブロックの外で宣言する必要があり、close()メソッドは「参照変数nullが入っていない」時にのみ呼び出す必要がある。
また、close()メソッドによっては例外投げるため、さらに例外処理う必要がある。
 
close()メソッドは上記のように使用が面倒だが、適切にわない場合、致命的な問題を引き起こす可能性があるため必ずうこと。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.io.FileReader;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // useFileReader()メソッドを呼び出します。
        useFileReader();

        // この時点で、useFileReader()メソッド内のfileReader変数は
        // 寿命が来たためなくなっています。ですが、
        // newした「FileReaderクラスのインスタンス」はなくならずに
        // 残っています。fileReader変数はただの「参照の入れ物」で、
        // 本体のインスタンスは残っているからです。このインスタンスは
        // ガベージコレクションによって消されるまで残っています。

        // つまり、インスタンスは「いつ消える」という寿命が
        // 決まっていません。その結果、C++のデストラクタのような
        // 「なくなったときに呼ばれるメソッド」というものを
        // Javaでは持つことができませんでした。
        // なので、Javaではclose()メソッドで明示的に終了処理をする必要があり、
        // その終了処理を必ずするためにfinallyがあるわけです。
    }

    /**
    *   FileReaderクラスを使うメソッド。
    *   寿命の話をするために、main()メソッドではなくこのメソッドで行います。
    */
    private static void useFileReader()
    {
        // ファイル入力を行うクラスでclose()メソッドの使用例を見てみます。
        // 他のクラスのclose()メソッドも似たようなものです。
        
        // 入力ファイルの絶対パス。
        String inputFilePath = "D:/from.txt";
        // FileReaderクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileReader fileReader = null;

        try
        {
            // FileReaderクラスを作って開きます。
            fileReader = new FileReader( inputFilePath );
            // それだけ。
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。そうすれば、上のIOException例外が
            // 投げられてもclose()メソッドが呼ばれるからです。
            try
            {
                if( fileReader != null )
                {
                    fileReader.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}
// Sample.java
import java.io.FileReader;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // useFileReader()メソッドを呼び出します。
        useFileReader();

        // この時点で、useFileReader()メソッド内のfileReader変数は
        // 寿命が来たためなくなっています。ですが、
        // newした「FileReaderクラスのインスタンス」はなくならずに
        // 残っています。fileReader変数はただの「参照の入れ物」で、
        // 本体のインスタンスは残っているからです。このインスタンスは
        // ガベージコレクションによって消されるまで残っています。

        // つまり、インスタンスは「いつ消える」という寿命が
        // 決まっていません。その結果、C++のデストラクタのような
        // 「なくなったときに呼ばれるメソッド」というものを
        // Javaでは持つことができませんでした。
        // なので、Javaではclose()メソッドで明示的に終了処理をする必要があり、
        // その終了処理を必ずするためにfinallyがあるわけです。
    }

    /**
    *   FileReaderクラスを使うメソッド。
    *   寿命の話をするために、main()メソッドではなくこのメソッドで行います。
    */
    private static void useFileReader()
    {
        // ファイル入力を行うクラスでclose()メソッドの使用例を見てみます。
        // 他のクラスのclose()メソッドも似たようなものです。
        
        // 入力ファイルの絶対パス。
        String inputFilePath = "D:/from.txt";
        // FileReaderクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileReader fileReader = null;

        try
        {
            // FileReaderクラスを作って開きます。
            fileReader = new FileReader( inputFilePath );
            // それだけ。
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。そうすれば、上のIOException例外が
            // 投げられてもclose()メソッドが呼ばれるからです。
            try
            {
                if( fileReader != null )
                {
                    fileReader.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/01
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。