Sto leggendo un file di testo carattere per carattere
fin è di tipo filereader

while (condizione) {
try {
intRead = fin.read();
if (intRead == -1) throw new EOFException();
} catch (IOException IOE) {
System.out.print("Errore di I/O");
}
...codice...
}

Se arriva alla fine del file faccio lanciare l'eccezione EOFEXception ed il programma mi entra nel blocco catch e mi genera il messaggio

Errore di I/O

ma nel programma viene lanciata un'eccezione di tipo EOF mentre il catch cattura eccezioni di tipo IO allora perchè entra nel blocco catch?