"Quando trabalhamos com java.io, diversos métodos lançam IOException, que é uma exception do tipo checked - o que nos obriga a tratá-la ou declará-la. Nos exemplos aqui, estamos declarando IOException através da clausula throws do main apenas para facilitar o exemplo. Caso a exception ocorra, a JVM vai parar, mostrando a stacktrace. Esta não é uma boa prática em uma aplicação real: trate suas exceptions para sua aplicação poder abortar elegantemente."
1º Dúvida - Esses métodos que lançam IOException, na verdade eles lançam a exceção nativamente pois existe a condição de não encontrar o resultado, neste caso, FileInputStream, não encontrar o arquivo, certo ? Foi programado assim pois tira a responsabilidade do desenvolvedor lançar o throw ?
2º Dúvida - "Esta não é uma boa prática em uma aplicação real: trate suas exceptions para sua aplicação poder abortar elegantemente.". Neste exemplo do FileInputStream, elegantemente, "O arquivo não foi encontrado". Certo ?
Abraços Galera Vitor Sampaio