Javaの例外(エクセプション)に総称型(ジェネリクス)を使う(1)
はじめに
Javaでは、変数の型については総称型や可変引数を使って柔軟に使うことができる。
一方で、変数に比べて例外は柔軟に使えるようになってきているのだろうか?
その辺を考えてみようと思う。
単純な例
クラスへの型引数として、例外型Eを与えたとすると、主に以下の二つが可能になります。
- 変数宣言時まで、投げる具体的なエクセプションの指定を遅らせることができる。
- 実行時例外と、それを継承する例外を指定した場合は、try-catch文を省略できる。
例
// 例外型E は、変数宣言時に与えられます public class Hoge<E extends Exception> { // この関数は、例外 E を投げます public void myFunction() throws E {} public static void main(String... args) { // 例外引数として IOExceptionを与える Hoge<IOException> myHoge = new Hoge<>(); try{ myHoge.myFunction(); catch(IOException e) { // IOExceptionでcatchする e.printStackTrace(); } // 例外引数として IOExceptionを与える Hoge<NullPointerException> myHoge = new Hoge<>(); try{ myHoge.myFunction(); catch(NullPointerException e) { // NullPointerExceptionでcatchする e.printStackTrace(); } Hoge<RuntimeException> myHoge = new Hoge<>(); myHoge.myFunction(); // ここでtry-catchを書かなくても、コンパイルエラーにならない! } }