Deixe-nos responder a uma pergunta da entrevista. Existe um método que lança NullPointerException na superclasse. Podemos substituí-lo por um método que lança RuntimeException?
Para responder a esta pergunta, diga-nos o que é uma exceção não verificada e verificada.
As exceções verificadas devem ser capturadas ou propagadas explicitamente conforme descrito em Tratamento básico de exceções try-catch-finally As exceções não verificadas não têm esse requisito. Eles não precisam ser pegos ou declarados lançados.
As exceções verificadas em Java estendem a classe java.lang.Exception. As exceções não verificadas estendem o java.lang.RuntimeException.
public class NullPointerException estende RuntimeException
As exceções não verificadas estendem o java.lang.RuntimeException. É por isso que NullPointerException é uma exceção não marcada.
Vejamos um exemplo: Exemplo 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
}
}
O programa será compilado com sucesso. Exemplo 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
}
}
O programa também será compilado com sucesso. Portanto, é evidente que nada acontece no caso de exceções não verificadas. Agora, vamos dar uma olhada no que acontece no caso de exceções verificadas. Exemplo 3: quando a classe base e a classe filha lançam uma exceção verificada
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);
}
}
}
O programa será compilado com sucesso. Exemplo 4: Quando o método da classe filha está lançando exceção de verificação de borda em comparação com o mesmo método da 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);
}
}
}
O programa não será compilado. Portanto, devemos ter cuidado ao usar exceções verificadas.