Bom, ja que falou em herança vamos la:
RuntimeExeption extends Exception --> RuntimeException é uma Exception, e é unchecked. Tudo que for um RuntimeException é unchecked!
Exception não é um RuntimeException!, se Exception não é um RuntimeException então Exception não é unchecked!
Por que minha classe SaldoInsuficienteException é unchecked e quando eu mudo a sua classe mae para Exception ela se torna checked?
Sendo que RuntimeException extends Exception
O fato de ser checked não passa pela herança?
Bom acho que é realmente um equivoco a afirmação acima certo, por que veja bem um cavalo é um animal, mas nem todo animal é um cavalo, temos os gatos, cachorros e tudo mais, sendo assim so para repetir, RumtimeException é uma Exception, mas nem toda Exception é um Runtime… já que para ser unchecked tem que passar no teste "é um" para Runtime Exception sua classe está herdando de exception, sendo assim é "unchecked".
Se fizer desta forma ae em cima tem uma classe RuntimeException pois SaldoInsuficienteException "herda" de RuntimeException, sendo assim você tem todos os metodos de RuntimeException e de Exception e de Throwable e de Object… ufa!, mais você lança uma Exception, veja creio que se você quer tratar somente exceções "unchecked" use RumtimeException, ae veja bem, você quer que quem use sua classe seja obrigado a "tratar" as exceptions? se sim você usa Exception…
que realmente é muito amplo…ou realmente a exceção condizente com o "perigo" que o método oferece IOExeption… e outras especificas daquela operação.
Espero ter ajudado.