Facciamo un'intervista Domanda. C'è un metodo che genera NullPointerException nella superclasse. Possiamo sovrascriverlo con un metodo che genera RuntimeException?
Per rispondere a questa domanda, facci sapere cos'è un'eccezione non verificata e selezionata.
Le eccezioni selezionate devono essere rilevate o propagate in modo esplicito come descritto in Gestione delle eccezioni try-catch-finalmente di base. Le eccezioni deselezionate non hanno questo requisito. Non devono essere catturati o dichiarati lanciati.
Le eccezioni verificate in Java estendono la classe java.lang.Exception. Le eccezioni non verificate estendono java.lang.RuntimeException.
public class NullPointerException estende RuntimeException
Le eccezioni non verificate estendono java.lang.RuntimeException. Ecco perché NullPointerException è un'eccezione Uncheked.
Facciamo un esempio: Esempio 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
}
}
Il programma verrà compilato correttamente. Esempio 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
}
}
Anche il programma verrà compilato correttamente. Pertanto è evidente che non accade nulla in caso di eccezioni non verificate. Ora, diamo un'occhiata a cosa succede in caso di eccezioni verificate. Esempio 3: quando la classe base e la classe figlia generano entrambe un'eccezione selezionata
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);
}
}
}
Il programma verrà compilato correttamente. Esempio 4: quando il metodo della classe figlio genera un'eccezione con controllo del bordo rispetto allo stesso metodo della classe base.
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);
}
}
}
Il programma non verrà compilato. Quindi, dobbiamo stare attenti quando usiamo le eccezioni controllate.