Olá Jade, tudo bem?
Entendo a sua dúvida sobre a diferença entre exceções checked e unchecked em Java. As exceções checked são aquelas que o compilador obriga o desenvolvedor a tratar, ou seja, é necessário colocar um bloco try-catch ou lançar a exceção para que o código compile. Já as exceções unchecked não precisam ser tratadas obrigatoriamente, mas podem ocorrer durante a execução do programa.
As exceções checked são usadas em situações em que o desenvolvedor pode prever que uma exceção pode ocorrer e quer garantir que ela seja tratada. Por exemplo, se você está lendo um arquivo em um programa, é possível que ocorra uma exceção de IO (entrada e saída) caso o arquivo não exista. Nesse caso, é importante tratar a exceção para que o programa não pare de funcionar.
Já as exceções unchecked são usadas em situações em que o desenvolvedor não pode prever que uma exceção pode ocorrer. Por exemplo, se você tentar dividir um número por zero, ocorrerá uma exceção de ArithmeticException. Essa exceção é unchecked porque o desenvolvedor não pode prever que o usuário vai digitar zero como divisor.
Pelo menos assim o Java "nasceu" mas hoje em dia praticamente só usa apenas exceções do tipo unchecked!
Quanto à sua pergunta sobre a instanciação de exceções, a diferença entre Exception e RuntimeException é que a primeira é checked e a segunda é unchecked. Isso significa que, se você instanciar uma exceção do tipo Exception, é necessário tratar a exceção obrigatoriamente. Já se você instanciar uma exceção do tipo RuntimeException, não é necessário tratar a exceção obrigatoriamente, mas é importante ter cuidado para que a exceção não interrompa o funcionamento do programa.
Espero ter ajudado e bons estudos!