2010-12-30 16 views
9

decir que tengo la siguienteJava: la captura de excepciones específicas

try{ 
//something 
}catch(Exception generic){ 
//catch all 
}catch(SpecificException se){ 
//catch specific exception only 
} 

¿Qué pasaría cuando se trata a través de SpecificException? ¿Lo detecta como una excepción genérica primero y luego capta la especificexception?

O solo detecta SpecificException mientras ignora las excepciones genéricas.

No quiero que se capturen la excepción genérica y especificada.

+0

La pregunta contiene código produciría un error de tiempo de compilación. La excepción general debe ser después de una excepción específica. –

Respuesta

10

No. Todas las excepciones quedarán atrapadas en el primer bloque. El segundo nunca se alcanzará (lo cual el compilador reconoce, lo que lleva a un error debido a un código inalcanzable). Si usted quiere tratar SpecificException específicamente, usted tiene que hacerlo al revés:

}catch(SpecificException se){ 
//catch specific exception only 
}catch(Exception generic){ 
//catch all 
} 

Entonces SpecificException serán capturados por el primer bloque, y todos los demás por el segundo.

+2

No entiendo por qué esta es la respuesta aceptada. Intentar capturar excepciones en el orden que se muestra en la pregunta original da como resultado un error de compilación, por lo que la afirmación "Todas las excepciones serán atrapadas por el primer bloque" no es aplicable. –

+0

ha sido verificado con javac? En Eclipse falla, pero javac podría simplemente emitir una advertencia. – Bozho

+0

Pensé que Michael se estaba refiriendo al código que publicó, en cuyo caso su declaración es correcta. – duffymo

21

Esto no se compilará. Se le informará que el bloque de excepción específico no es accesible.

Primero tiene que tener el bloque catch de excepciones más específico, seguido por el general.

try 
{ 
    //something 
} 
catch(SpecificException se) 
{ 
    //catch specific exception only 
} 
catch(Exception generic) 
{ 
    //catch all 
} 
+0

Imagine que el compilador nos permitió escribir excepciones en cualquier orden. Qué diferencia haría ? No veo ninguna diferencia. Entonces, ¿por qué hacer cumplir una orden? –

+0

Imagine que era un hombre rico, 20 años más joven. ¿Qué diferencia haría? Imagina todo lo que quieras, pero así es como funciona el JDK. – duffymo

+0

Con esa lógica, ¿por qué molestarse en encontrar razones para algo? ¿Por qué java no permite herencia múltiple? A quien le importa ? Simplemente funciona de esa manera. Ver el punto que estoy tratando de hacer? Sí, esta mi pregunta no es importante o crítica. Pero sería bueno saber la respuesta. Chenqui. –

6

Esto no compila con el compilador Eclipse:

bloque catch inalcanzable para IOException. Ya lo maneja el bloque catch para Excepción

Así que defínelas de otra manera. Solo el específico será atrapado.

1

Como nota al margen, la única forma de llamar a ambos bloques de catch es usar excepciones anidadas.

try { 
    try{ 
    //something 
    }catch(SpecificException se){ 
    //catch specific exception only 
    throw se; 
    } 
}catch(Exception generic){ 
//catch all 
} 
3

La captura bloques se prueban en orden, y el primero que coincida con el tipo de excepción se ejecuta. Como Exception es la superclase de todos los tipos de excepciones, siempre se ejecutará en esta instancia y los casos específicos nunca se ejecutarán. De hecho, el compilador es lo suficientemente inteligente como para darse cuenta de esto y generar un error de compilación.

Reordenar las cláusulas catch.

Cuestiones relacionadas