前回で検査例外と非検査例外の違いを説明しました。
実際に簡単なサンプルを書いてみました。
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つです。
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での出題率が高い例外クラスが含まれます。
必ず 「コンパイルエラーが発生する」と、
「実行時に例外がスローされる」が入っています。
それほど大事な例外処理ですが、
私はコンパイルエラーと例外(Exception)の違いが、
なかなか分かりませんでした。
当然、OCJ-Pの問題ではその区別は大事で、
曖昧なまま受験すると痛い目を見ます。
ここ数日の研究でやっと分かってきたので、
コンパイルエラーと実行時例外の区別法を伝授します。
まずは例外の区別を学びましょう。
例外には2種類あります。
1つは、検査例外(チェック例外)。
もう1つは非検査例外(非チェック例外、実行時例外)です。
検査例外とは、実行前から例外の発生が予想される例外。
つまりコンパイル時に例外処理を求められて、
例外処理をしていなければ、コンパイルエラーになる例外です。
非検査例外とは、実際に実行してみないと発生が分からない例外です。
つまりコンパイル時には例外処理をしていなくても、
コンパイルエラーにはなりません。
実行結果として、発生した時点でスローされて、
○○Exceptionがスローされました と知らされるのです。(英語で)
実際にOCJ-Pでも、実務でも遭遇する可能性が高いのは、
2番目の非検査例外です。
非検査例外には、NullPointerExceptionやIndexOutOfBoudsExceptionなど、
OCJ-Pでの出題率が高い例外クラスが含まれます。