Método substituindo em Java lançando exceções

Eu estou tentando entender a fundição de objetos e substituição de método.

Eu tenho um pedaço de código:

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

    }

    class A extends ExceptionClass{

        void m() throws Exception{}
    }

Isto dá um erro "Exception Exception não é compatível com throws cláusula em ExceptionClass.m ()".

O mesmo se eu escrever como:

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

    class A extends ExceptionClass{

        void m() throws RuntimeException{}
    }

Isso não dá nenhum erro e o método também é substituído corretamente. Depois de algumas análises eu pensei que poderia ser, já que SQLException se estende da classe Exception, portanto nós não podemos substituir "SQLException" por "Exception" na subclasse (estamos mudando a assinatura do método substituído).

Mas então eu fiz isso:

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

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

Mas não há erro aqui ..! Eu pensei que deveria dar o mesmo erro por causa da razão que eu mencionei acima.

Não sei por que está se comportando dessa maneira. Além disso, quais são as regras a serem seguidas quando substituirmos os métodos, que lançam exceções na assinatura do método.

questionAnswers(3)

yourAnswerToTheQuestion