Olá Leonardo!
Entendo que você está com dúvidas sobre a hierarquia de exceções no bloco try/catch em Java. Vou tentar te ajudar a entender a diferença entre as duas situações mencionadas.
No Java, as exceções são organizadas em uma hierarquia de classes, onde todas as exceções são subclasses da classe Throwable. Essa classe possui duas subclasses principais: Exception e Error.
As exceções que herdam da classe Exception são chamadas de exceções verificadas (checked exceptions). Isso significa que essas exceções devem ser tratadas explicitamente em um bloco try-catch ou declaradas em uma cláusula throws na assinatura do método. Um exemplo é a classe de exceção IOException, que indica algum problema relacionado com leitura/escrita de dados.
Já as exceções que herdam da classe Error representam erros irrecuperáveis pelo sistema, como falta de memória ou falhas internas. Um exemplo é a classe de exceção OutOfMemoryError, que indica que o Java não conseguiu memória suficiente do sistema operacional para executar corretamente a aplicação.
Além disso, existe a classe de exceção RuntimeException, que é uma subclasse direta de Exception, e as classes que herdam dela são chamadas de exceções não verificadas (unchecked exceptions). Essas exceções indicam erros lógicos no código, como a NullPointerException, que indica o acesso a algum atributo ou método de um objeto que é nulo.
A diferença entre capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha e o inverso é a seguinte: é possível capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha, mas não é possível capturar exceções de uma classe pai em um bloco catch que captura exceções de uma classe filha.
Por exemplo, se tivermos um bloco catch que captura exceções de uma classe filha IOException, ele também será capaz de capturar exceções da classe mãe Exception. No entanto, se tivermos um bloco catch que captura exceções de uma classe mãe Exception, ele não será capaz de capturar exceções de uma classe filha IOException.
Isso acontece porque a hierarquia de exceções segue a lógica de que uma classe filha é mais específica do que uma classe mãe. Portanto, um bloco catch que captura exceções de uma classe filha pode lidar com exceções mais específicas, mas não pode lidar com exceções mais genéricas.
Espero que essa explicação possa te ajudar a entender a diferença entre as duas situações. Se tiver mais alguma dúvida, é só me dizer!
Espero ter ajudado e bons estudos!