JavaA2Z

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

catch

日本語 捕獲
英語 catch
ふりがな きゃっち
フリガナ キャッチ

解説

投げられた例外を止めるための予約語
tryで囲まれた範囲内で投げられる例外拾うために使用する。catchで止められなければ、例外メソッドの外へと抜けていく。
try{ 例外投げられる範囲 }catch( 止める例外 変数 ) { う処理 }」という構文で、「止める例外」が投げられた場合に「う処理」が実される。
拾うことのできる例外は、完全に一致した例外か、もしくはサブクラス例外のみ。異なる例外拾うことができず、外へ逃げていく。
catchで指定した例外サブクラス拾うことができるため、親の方、つまりExceptionクラスに近ければ近いほど、多くの例外拾うことができる。
拾った例外は「catch( 止める例外 変数 )」の「変数」に格納される。これは、例外投げる際に作られたインスタンス参照がそのまま格納される。そのため、投げられた例外が「止める例外」のサブクラスの場合、変数にはそのサブクラス参照が格納されていることになる。
catchはひとつのtryに対して複数用意することができる。try内で例外が投げられた場合、上から順にcatchの例外クラスと同じかそのサブクラスかを調べ、そうであればそのcatch内のみが処理される。
この「catchの並び」にスーパークラスサブクラスを混在させる場合、スーパークラスを上に、サブクラスを下にすると、サブクラスでのcatchは意味がないためコンパイルエラーとなる。逆に、サブクラスを上に、スーパークラスを下にすることで、サブクラス個別の処理と、一般的な例外の処理とを組み合わせることができる。
このように、例外継承ポリモーフィズムと密接に結びついているため、難易度は高いと言える。

参考サイト


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

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

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // 一般的な例。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:9)
            // このように、投げられた例外を止めます。
        }

        // 例外が異なると拾えません。
        try
        {
            try
            {
                // NullPointerExceptionを投げます。
                throw new NullPointerException();
            }
            catch( ClassCastException e )
            {
                // 例外が異なるのでここには来ません。
                System.out.println( "来ないよー" );
            }

            System.out.println( "ここも来ないよー" );
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:26)
            // 例外が異なっていると拾うことができないので、
            // 上記の箇所ではなくこちらで拾われます。
        }

        // 例外は複数指定できます。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( ClassCastException e )
        {
            // 例外が異なるのでここには来ません。
            System.out.println( "来ないよー" );
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:49)
            // catchは上から順にチェックされ、一致したら
            // 中の処理が行われます。
        }

        // ポリモーフィズムが適用される例。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( Exception e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:69)
            // スーパークラスの例外は、サブクラスの例外を
            // 止めることができます。また、この時、
            // 投げられた例外のインスタンスは投げられた時
            // そのままです。
            System.out.println( e instanceof NullPointerException );
            // true
        }
        // だから順番が重要です。上の続きでNullPointerExceptionを
        // 拾おうとすると、「絶対に拾えない」のでコンパイルエラーになります。
        // catch( NullPointerException e ){}
        // コンパイルエラー:
        // 到達不可能な catch ブロック
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // 一般的な例。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:9)
            // このように、投げられた例外を止めます。
        }

        // 例外が異なると拾えません。
        try
        {
            try
            {
                // NullPointerExceptionを投げます。
                throw new NullPointerException();
            }
            catch( ClassCastException e )
            {
                // 例外が異なるのでここには来ません。
                System.out.println( "来ないよー" );
            }

            System.out.println( "ここも来ないよー" );
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:26)
            // 例外が異なっていると拾うことができないので、
            // 上記の箇所ではなくこちらで拾われます。
        }

        // 例外は複数指定できます。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( ClassCastException e )
        {
            // 例外が異なるのでここには来ません。
            System.out.println( "来ないよー" );
        }
        catch( NullPointerException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:49)
            // catchは上から順にチェックされ、一致したら
            // 中の処理が行われます。
        }

        // ポリモーフィズムが適用される例。
        try
        {
            // NullPointerExceptionを投げます。
            throw new NullPointerException();
        }
        catch( Exception e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:69)
            // スーパークラスの例外は、サブクラスの例外を
            // 止めることができます。また、この時、
            // 投げられた例外のインスタンスは投げられた時
            // そのままです。
            System.out.println( e instanceof NullPointerException );
            // true
        }
        // だから順番が重要です。上の続きでNullPointerExceptionを
        // 拾おうとすると、「絶対に拾えない」のでコンパイルエラーになります。
        // catch( NullPointerException e ){}
        // コンパイルエラー:
        // 到達不可能な catch ブロック
    }
}

この単語を含むページ

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

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

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