JavaA2Z

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

throws

日本語 例外指定
英語 throw exceptions
ふりがな すろうず
フリガナ スロウズ

解説

メソッド投げる例外を指定する予約語
予約語のひとつ。「そのメソッドからどんな例外投げられるか」を示すために使用する。
 
メソッド宣言の後ろに「throws 投げられる例外」という書式で指定する。複数の例外投げられる場合には「throws 投げられる例外1, 投げられる例外2」のように「,」(カンマ)で継なぐ。
メソッド内で例外投げられることがはっきりと分かっている場合、その例外は、catchして例外処理するか、もしくはこのthrowsを使用して「投げられる例外」を明示し、メソッド呼び出す側に例外処理させる必要がある。このうちどちらもわれなかった場合、コンパイルエラーが発生する。
メソッド内で投げられる例外catch例外処理しない場合、その例外メソッドの外へと投げられるメソッド呼び出す側がその例外を適切に処理するため、メソッドが「どの例外投げるのか」ということを明示しておく必要がある。そのための予約語である。
 
throwsによる指定も「例外投げられることを示す印」であり、そのため、throwsのあるメソッド呼び出す場合には、そのthrowsで指定された例外に対しても、catchして例外処理するか、throwsで通過させて呼び出し元に処理させるのかを選択することになる。
もしこの機能がなかった場合、処理すべき例外を「うっかり」処理し忘れてしまう可能性があり、それを避けるためにコンパイルエラーが発生すると考えられる。
また、メソッド呼び出す側としても、throwsがなければ「どのような例外が発生するか」知る術がなく、throwsにより例外を指定することで例外が投げられたときに対処する事ができるようになる。
 
ただし、例外処理わなくてもよい、RuntimeExceptionサブクラスに当たる例外は、同様にthrowsによる指定をする必要はない。
この「RuntimeExceptionサブクラスの特例」の存在や、実装寄りの問題であるにも関わらず設計にも影響があること、throwsを変更することによりこれまで呼べたメソッドが呼べなくなること、オーバーライドする場合に大きな制約となる等の理由により、非常に敷居が高く、問題が発生しやすい高度な機能となっている。プログラムが肥大化すればするほど、考えに考え抜いて使用しない限り最終的に矛盾だらけとなり破綻する可能性があるため、現実的に使いこなすのが非常に難しい機能と言える。

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

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

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        Sample sample = new Sample();

        try
        {
            // classNotFoundExceptionThrower()メソッドを呼び出します。
            sample.classNotFoundExceptionThrower();
        }
        catch( ClassNotFoundException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:16)
        }

        // catchで受け取らないとコンパイルエラーになります。
        // sample.classNotFoundExceptionThrower();
        // コンパイルエラー:
        // 処理されない例外の型 ClassNotFoundException
    }

    /**
    *   ClassNotFoundExceptionを投げるメソッド。
    */
    private void classNotFoundExceptionThrower() throws ClassNotFoundException
    {
        throw new ClassNotFoundException();
        // ClassNotFoundException例外を投げます。
        // もしthrowsがないと、以下のようなコンパイルエラーになります。
        // コンパイルエラー:
        // 処理されない例外の型 ClassNotFoundException

        // ちなみにthrowsは「投げるかもしれない」だけなので、
        // 必ずしも投げなくてもいいです。
    }

    /**
    *   classNotFoundExceptionThrowerを呼ぶメソッド。
    */
    private void classNotFoundExceptionThrowerCaller() throws ClassNotFoundException
    {
        // catchする以外にも、throwsでパスすることでも解決できます。
        classNotFoundExceptionThrowerCaller();
        // ClassNotFoundExceptionをcatchしていませんが、
        // throwsで指定しているので、ここではcatchする必要は
        // ありません。ただし、このメソッドを呼ぶ側で
        // 何らかの対処が必要になりますが。
    }


    /**
    *   ClassNotFoundExceptionとNoSuchMethodExceptionを投げるメソッド。
    */
    private void classNotFoundExceptionAndNoSuchMethodExceptionThrower() throws ClassNotFoundException, NoSuchMethodException
    {
        // このように、複数の例外が投げられる可能性がある場合には
        // 「,」(カンマ)で区切ります。
    }

    /**
    *   NullPointerExceptionを投げるメソッド。
    */
    private void nullPointerExceptionThrower()
    {
        throw new NullPointerException();
        // NullPointerExceptionのように、
        // RuntimeExceptionのサブクラスが投げられる場合には
        // throwsを指定する必要はありません。
        // そんなことしてたらきりないですから。
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        Sample sample = new Sample();

        try
        {
            // classNotFoundExceptionThrower()メソッドを呼び出します。
            sample.classNotFoundExceptionThrower();
        }
        catch( ClassNotFoundException e )
        {
            e.printStackTrace();
            // java.lang.NullPointerException
            //     at Sample.main(Sample.java:16)
        }

        // catchで受け取らないとコンパイルエラーになります。
        // sample.classNotFoundExceptionThrower();
        // コンパイルエラー:
        // 処理されない例外の型 ClassNotFoundException
    }

    /**
    *   ClassNotFoundExceptionを投げるメソッド。
    */
    private void classNotFoundExceptionThrower() throws ClassNotFoundException
    {
        throw new ClassNotFoundException();
        // ClassNotFoundException例外を投げます。
        // もしthrowsがないと、以下のようなコンパイルエラーになります。
        // コンパイルエラー:
        // 処理されない例外の型 ClassNotFoundException

        // ちなみにthrowsは「投げるかもしれない」だけなので、
        // 必ずしも投げなくてもいいです。
    }

    /**
    *   classNotFoundExceptionThrowerを呼ぶメソッド。
    */
    private void classNotFoundExceptionThrowerCaller() throws ClassNotFoundException
    {
        // catchする以外にも、throwsでパスすることでも解決できます。
        classNotFoundExceptionThrowerCaller();
        // ClassNotFoundExceptionをcatchしていませんが、
        // throwsで指定しているので、ここではcatchする必要は
        // ありません。ただし、このメソッドを呼ぶ側で
        // 何らかの対処が必要になりますが。
    }


    /**
    *   ClassNotFoundExceptionとNoSuchMethodExceptionを投げるメソッド。
    */
    private void classNotFoundExceptionAndNoSuchMethodExceptionThrower() throws ClassNotFoundException, NoSuchMethodException
    {
        // このように、複数の例外が投げられる可能性がある場合には
        // 「,」(カンマ)で区切ります。
    }

    /**
    *   NullPointerExceptionを投げるメソッド。
    */
    private void nullPointerExceptionThrower()
    {
        throw new NullPointerException();
        // NullPointerExceptionのように、
        // RuntimeExceptionのサブクラスが投げられる場合には
        // throwsを指定する必要はありません。
        // そんなことしてたらきりないですから。
    }
}

この単語を含むページ

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

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