インタビューの質問を受けましょう。スーパークラスにNullPointerExceptionをスローするメソッドがあります。RuntimeExceptionをスローするメソッドでオーバーライドできますか?
この質問に答えるために、未チェックおよびチェック済みの例外とは何かをお知らせください。
チェックされた例外は、基本的なtry-catch-finally例外処理で説明されているように、明示的にキャッチまたは伝播する必要があります。未チェックの例外にはこの要件はありません。捕まったり、投げられたと宣言する必要はありません。
Javaのチェック済み例外は、java.lang.Exceptionクラスを拡張します。未チェックの例外は、java.lang.RuntimeExceptionを拡張します。
パブリッククラスNullPointerExceptionはRuntimeExceptionを拡張します
未チェックの例外は、java.lang.RuntimeExceptionを拡張します。これが、NullPointerExceptionがUncheked例外である理由です。
例を見てみましょう:例1:
public class Parent {
public void name() throws NullPointerException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws RuntimeException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
プログラムは正常にコンパイルされます。例2:
public class Parent {
public void name() throws RuntimeException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws NullPointerException {
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
プログラムも正常にコンパイルされます。したがって、Unchecked例外の場合は何も起こらないことは明らかです。それでは、チェック例外の場合にどうなるか見てみましょう。例3:基本クラスと子クラスの両方がチェック例外をスローする場合
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws IOException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();// output=> child
}catch( Exception e) {
System.out.println(e);
}
}
}
プログラムは正常にコンパイルされます。例4:子クラスのメソッドが、基本クラスの同じメソッドと比較して境界チェック例外をスローしている場合。
import java.io.IOException;
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws Exception{ // broader exception
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();//output=> Compilation failure
}catch( Exception e) {
System.out.println(e);
}
}
}
プログラムはコンパイルに失敗します。したがって、チェック例外を使用する場合は注意が必要です。