Método que anula en Java lanzando excepciones

Estoy tratando de entender la conversión de objetos y la anulación de métodos.

Tengo un pedazo de código:

    public class ExceptionClass{
        void m() throws SQLException{}

    }

    class A extends ExceptionClass{

        void m() throws Exception{}
    }

Esto da un error "Exception Exception no es compatible con la cláusula throws en ExceptionClass.m ()".

Lo mismo si escribo como:

    public class ExceptionClass{
        void m() throws SQLException{}
    }

    class A extends ExceptionClass{

        void m() throws RuntimeException{}
    }

Esto no da ningún error y el método también se anula correctamente. Después de algunos análisis, pensé que podría ser, ya que SQLException se extiende desde la clase Exception, por lo tanto, no podemos reemplazar "SQLException" con "Exception" en la subclase (estamos cambiando la firma del método anulado).

Pero luego hice esto:

    public class ExceptionClass{
        void m() throws NullPointerException{}
    }

    class A extends ExceptionClass{
        void m() throws RuntimeException{}  
    }

Pero no hay error aquí ..! Pensé que debería dar el mismo error por la razón que mencioné anteriormente.

No estoy seguro de por qué se comporta de esta manera. Además, ¿cuáles son las reglas a seguir cuando anulamos los métodos, que arrojan Excepciones en la firma del método?

Respuestas a la pregunta(3)

Su respuesta a la pregunta