Exceções verificadas vs não verificadas em Java

Estou tendo alguns problemas para entender as diferenças entrechecked eunchecked exceções em Java.

Primeiramente,checked exceções devem procurar anormalidades durante o tempo de compilação. Exemplos fornecidos em diferentes fontes citam conectividade de banco de dados, manipulação de arquivos como alguns deles, enquantounchecked exceções devem procurar erros por parte do programador, como indexar além do intervalo de um array, etc.

Não deveria ser o contrário? Quero dizer, a conectividade do banco de dados é feita durante o tempo de execução, certo? O mesmo vale para o manuseio de arquivos. Você não abre um identificador de arquivos durante o tempo de compilação, então por que um erro possível é procurado durante o tempo de compilação? Por outro lado, a indexação de uma matriz além de seu intervalo já é feita no programa, que pode ser verificado durante o tempo de compilação (se o índice anormal for fornecido pelo usuário durante o tempo de execução, não há problema em ser um tempo de execução problema). O que estou perdendo aqui?

2 Em segundo lugar, como podeRunTimeExceptionsendo ele mesmouncheckedsubclasseException, qual échecked? O que isso significa?

Eu encontrei um exemplo no livro de Herbert Schildt explicando o uso dechecked exceções:

class ThrowsDemo {
   public static char prompt(String str)
      throws java.io.IOException {
  System.out.print(str + ": ");
  return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

É othrows cláusula necessária aqui? Por que não posso fazer isso normalmente com umtry-catch declaração como esta (desculpe, eu não sei como simular umIO Exception, então não pude checar eu mesmo!):

class ThrowsDemo {
   public static char prompt(String str)  {
     System.out.print(str + ": ");
     return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

questionAnswers(8)

yourAnswerToTheQuestion