throws
日本語 | 例外指定 |
英語 | throw exceptions |
ふりがな | すろうず |
フリガナ | スロウズ |
メソッドが投げる例外を指定する予約語。
予約語のひとつ。「そのメソッドからどんな例外が投げられるか」を示すために使用する。
メソッドの宣言の後ろに「throws 投げられる例外」という書式で指定する。複数の例外が投げられる場合には「throws 投げられる例外1, 投げられる例外2」のように「,」(カンマ)で継なぐ。
メソッド内で例外が投げられることがはっきりと分かっている場合、その例外は、catchして例外処理するか、もしくはこのthrowsを使用して「投げられる例外」を明示し、メソッドを呼び出す側に例外処理させる必要がある。このうちどちらも行われなかった場合、コンパイルエラーが発生する。
メソッド内で投げられる例外をcatchで例外処理しない場合、その例外はメソッドの外へと投げられる。メソッドを呼び出す側がその例外を適切に処理するため、メソッドが「どの例外を投げるのか」ということを明示しておく必要がある。そのための予約語である。
throwsによる指定も「例外が投げられることを示す印」であり、そのため、throwsのあるメソッドを呼び出す場合には、そのthrowsで指定された例外に対しても、catchして例外処理するか、throwsで通過させて呼び出し元に処理させるのかを選択することになる。
もしこの機能がなかった場合、処理すべき例外を「うっかり」処理し忘れてしまう可能性があり、それを避けるためにコンパイルエラーが発生すると考えられる。
また、メソッドを呼び出す側としても、throwsがなければ「どのような例外が発生するか」知る術がなく、throwsにより例外を指定することで例外が投げられたときに対処する事ができるようになる。
ただし、例外処理を行わなくてもよい、RuntimeExceptionのサブクラスに当たる例外は、同様にthrowsによる指定をする必要はない。
この「RuntimeExceptionサブクラスの特例」の存在や、実装寄りの問題であるにも関わらず設計にも影響があること、throwsを変更することによりこれまで呼べたメソッドが呼べなくなること、オーバーライドする場合に大きな制約となる等の理由により、非常に敷居が高く、問題が発生しやすい高度な機能となっている。プログラムが肥大化すればするほど、考えに考え抜いて使用しない限り最終的に矛盾だらけとなり破綻する可能性があるため、現実的に使いこなすのが非常に難しい機能と言える。
予約語のひとつ。「そのメソッドからどんな例外が投げられるか」を示すために使用する。
メソッドの宣言の後ろに「throws 投げられる例外」という書式で指定する。複数の例外が投げられる場合には「throws 投げられる例外1, 投げられる例外2」のように「,」(カンマ)で継なぐ。
メソッド内で例外が投げられることがはっきりと分かっている場合、その例外は、catchして例外処理するか、もしくはこのthrowsを使用して「投げられる例外」を明示し、メソッドを呼び出す側に例外処理させる必要がある。このうちどちらも行われなかった場合、コンパイルエラーが発生する。
メソッド内で投げられる例外をcatchで例外処理しない場合、その例外はメソッドの外へと投げられる。メソッドを呼び出す側がその例外を適切に処理するため、メソッドが「どの例外を投げるのか」ということを明示しておく必要がある。そのための予約語である。
throwsによる指定も「例外が投げられることを示す印」であり、そのため、throwsのあるメソッドを呼び出す場合には、そのthrowsで指定された例外に対しても、catchして例外処理するか、throwsで通過させて呼び出し元に処理させるのかを選択することになる。
もしこの機能がなかった場合、処理すべき例外を「うっかり」処理し忘れてしまう可能性があり、それを避けるためにコンパイルエラーが発生すると考えられる。
また、メソッドを呼び出す側としても、throwsがなければ「どのような例外が発生するか」知る術がなく、throwsにより例外を指定することで例外が投げられたときに対処する事ができるようになる。
ただし、例外処理を行わなくてもよい、RuntimeExceptionのサブクラスに当たる例外は、同様にthrowsによる指定をする必要はない。
この「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を指定する必要はありません。
// そんなことしてたらきりないですから。
}
}
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を指定する必要はありません。 // そんなことしてたらきりないですから。 } }
「みだし」に含まれているページ
「解説」に含まれているページ
- ,
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- Caused by
- ClassCastException
- IllegalArgumentException
- IndexOutOfBoundsException
- InvocationTargetException
- NoSuchElementException
- NullPointerException
- NumberFormatException
- RuntimeException
- ServletException
- StringIndexOutOfBoundsException
- throws
- シグネチャー
- 予約語
- 例外処理
「サンプルプログラムとか」に含まれているページ
- ,
- <jsp:useBean>
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- Caused by
- classesディレクトリ
- clone
- Cloneable
- CloneNotSupportedException
- close
- Cookie
- DataInputStream
- DataOutputStream
- doGet
- doPost
- EOF
- EOFException
- FileInputStream
- FileReader
- FilterInputStream
- FilterOutputStream
- FilterReader
- FilterWriter
- HttpServlet
- HttpServletRequest
- HttpServletResponse
- HttpSession
- InputStream
- InputStreamReader
- JavaBeans
- JSP暗黙オブジェクト「request」
- JSP暗黙オブジェクト「session」
- LineNumberInputStream
- LineNumberReader
- ObjectInputStream
- ObjectOutputStream
- OutputStream
- OutputStreamWriter
- PrintStream
- PushbackInputStream
- PushbackReader
- Reader
- RequestDispatcher
- SequenceInputStream
- Serializable
- ServletConfig
- ServletContext
- ServletException
- StringBufferInputStream
- throws
- transient
- web.xml
- Writer
- カスタムタグライブラリ
- キャッシュ
- クッキー
- クロスサイトスクリプティング
- サニタイジング
- サーブレット
- セッション
- セッションID
- セッションスコープ
- テキストファイル
- バイト入力ストリーム
- バイト出力ストリーム
- バイナリーファイル
- ブロックします
- リクエストスコープ
- リフレクション
- 入力フォーム
- 契約による設計
- 文字入力ストリーム
- 標準入出力
- 浅いコピー
- 深いコピー
- 直列化