Dlaczego tak
Bloki catch są sprawdzane po kolei i wykonuje się pierwszy pasujący, dlatego wyjątki szczegółowe umieszcza się przed ogólnymi: FileNotFoundException, potem jej nadklasa IOException, na końcu Exception. Gdyby IOException stała przed FileNotFoundException, przechwytywałaby także jej podklasę, a kompilator Javy zgłosiłby błąd, że wyjątek został już obsłużony. Kolejność od Exception sprawiłaby, że dalsze bloki nigdy by się nie wykonały.