Javaプログラマー資格試験(OCJ-P) WEB講座 -2ページ目

Javaプログラマー資格試験(OCJ-P) WEB講座

Javaプログラマー資格(OCJ-P)を学習するブログです。

OCJ-P・Javaプログラマー資格をとりたい。
Javaプログラミングの入門者・初心者。

そんなあなたに、Javaプログラマー資格の取得に役立つ本質的な知識を、
分かりやすく解説していきます。

 前回で検査例外と非検査例外の違いを説明しました。
実際に簡単なサンプルを書いてみました。

1.通常の例外(検査例外)

public class A {

 void test() throws Exception{
  System.out.println("test");
 }

 public static void main(String[] args) {

  A a = new A();
  a.test();
 }
}

2.非検査例外

public class A {

 void test() throws RuntimeException{
  System.out.println("test");
 }

 public static void main(String[] args) {

  A a = new A();
  a.test();
 }
}

赤の部分だけが異なるところです。
実際に実行してみて下さいね。







 実行結果は、
1 ではコンパイルエラーになります。
2 ではコンパイルエラーにならず、testと表示されます。

なんとなく分かってもらえたでしょうか?
では、1をコンパイルするためにはどうすればいいでしょうか?

もちろん、例外処理ですね。
さらにExceptionをthrowしてぶん投げてもいいですし、
try~catchで適切に処理してもOKです。

 例えば
1-1.

public class A {

 void test() throws Exception{
  System.out.println("test");
 }

 public static void main(String[] args) throws Exception {

  A a = new A();
  a.test();
 }
}

1-2.

public class A {

 void test() throws Exception{
  System.out.println("test");
 }

 public static void main(String[] args) {

  A a = new A();
  
  try{
   a.test();
  } catch(Exception e){ }
 }
}

などですね^^
 ExceptionとRuntimeExceptionの違いを説明します。
Exceptionクラスの下に、RuntimeExceptionクラスがあります。

つまり、、
Exceptionクラス
 ∟RuntimeExceptionクラス

です。

そして、RuntimeExceptionクラスの例外のことを、
非検査例外(非チェック例外)と言いいます。

 個人的には非チェック例外という言い方が好きなのですが、
何が非チェック = チェックされないのでしょうか?

それは、コンパイル時にその例外が発生するかどうかは、
チェックされませんよ。ということです。

別の言い方をすれば、コンパイル時に、
その例外を処理するコードが書かれているかどうかは、
チェックされませんよ。ということ。

 例えば、RuntimeExceptionクラスを投げるメソッドを定義します。
(例: void test() throws RuntimeException{})
そのメソッドを呼び出すとき、例外処理をしなくても、
コンパイルエラーになりません。
(例:x.test() だけでもOK!)

通常のExceptionクラスを投げるメソッドを呼び出すとき、
(例: void test() throws Exception{})
try~catchなどで例外処理をしないとコンパイルエラーになります。
(例: try{ x.test() } catch (Exception e) {} など)

これが検査例外と非検査例外の大きな違いの1つです。
 OCJ-Pの問題を見ると、選択肢が特徴的ですね。
必ず 「コンパイルエラーが発生する」と、
「実行時に例外がスローされる」
が入っています。

それほど大事な例外処理ですが、
私はコンパイルエラーと例外(Exception)の違いが、
なかなか分かりませんでした。

当然、OCJ-Pの問題ではその区別は大事で、
曖昧なまま受験すると痛い目を見ます。

ここ数日の研究でやっと分かってきたので、
コンパイルエラーと実行時例外の区別法を伝授します。


 まずは例外の区別を学びましょう。
例外には2種類あります。

1つは、検査例外(チェック例外)。
もう1つは非検査例外(非チェック例外、実行時例外)です。


検査例外とは、実行前から例外の発生が予想される例外。
つまりコンパイル時に例外処理を求められて、
例外処理をしていなければ、コンパイルエラーになる例外です。

非検査例外とは、実際に実行してみないと発生が分からない例外です。
つまりコンパイル時には例外処理をしていなくても、
コンパイルエラーにはなりません。

実行結果として、発生した時点でスローされて、
○○Exceptionがスローされました と知らされるのです。(英語で)

実際にOCJ-Pでも、実務でも遭遇する可能性が高いのは、
2番目の非検査例外です。

非検査例外には、NullPointerExceptionやIndexOutOfBoudsExceptionなど、
OCJ-Pでの出題率が高い例外クラスが含まれます。