El orden es lo que coincida primero, se ejecuta (as the JLS clearly explains).
Si la primera coincidencia coincide con la excepción, se ejecuta, si no lo hace, se prueba la siguiente y así sucesivamente hasta que uno coincida o ninguno.
Por lo tanto, cuando capture excepciones, siempre deberá detectar el más específico y luego el más genérico (como RuntimeException o Exception). Por ejemplo, imagine que desea coger el StringIndexOutOfBoundsException arrojados por el método String.charAt(index) pero su código también podría lanzar un NullPointerException, aquí es cómo usted podría ir a coger las excepciones:
String s = null;
try {
s.charAt(10);
} catch (NullPointerExeption e) {
System.out.println("null");
e.printStackTrace();
} catch (StringIndexOutOfBoundsException e) {
System.out.println("String index error!");
e.printStackTrace();
} catch (RuntimeException e) {
System.out.println("runtime exception!");
e.printStackTrace();
}
Así, con este fin, Me aseguro de que las excepciones se capten correctamente y no se tropiecen entre sí, si es NullPointerException ingresa el primer catch, si StringIndexOutOfBoundsException ingresa el segundo y finalmente si es otra cosa que es RuntimeException (o hereda de él, como un IllegalArgumentException) entra en la tercera captura.
Su caso es correcto ya que IOException hereda de Exception y RuntimeException también hereda de Exception, por lo que no se tropezarán entre sí.
Es también un error de compilación para atrapar una excepción genérica primero y luego uno de los descendientes es tarde, como en:
try {
// some code here
} catch (Exception e) {
e.printStackTrace();
} catch (RuntimeException e) { // this line will cause a compilation error because it would never be executed since the first catch would pick the exception
e.printStackTrace();
}
Por lo tanto, usted debe tener los niños en primer lugar y luego las excepciones de los padres.
'Quiero' no tiene nada que ver con eso. El compilador impone el orden correcto. – EJP