2010-05-28 18 views
7

¿Por qué no se puede lanzar una InterruptedException de la siguiente manera:tiro excepción

try { 
    System.in.wait(5) //Just an example 
} catch (InterruptedException exception) { 
    exception.printStackTrace(); 
//On this next line I am confused as to why it will not let me throw the exception 
    throw exception; 
} 

Fui a http://java24hours.com, pero no me dijo por qué no podía lanzar una InterruptedException.
Si alguien sabe por qué, POR FAVOR dime! ¡Estoy desesperado! : S

+0

¿Qué tipo de error obtienes? – Simon

+0

Dice: excepción no reportada java.lang.InterruptedException; debe ser atrapado o declarado arrojado – fireshadow52

Respuesta

13

Solo puede lanzarlo si el método que está escribiendo declara que arroja InterruptedException (o una clase base).

Por ejemplo:

public void valid() throws InterruptedException { 
    try { 
    System.in.wait(5) //Just an example 
    } catch (InterruptedException exception) { 
    exception.printStackTrace(); 
    throw exception; 
    } 
} 

// Note the lack of a "throws" clause. 
public void invalid() { 
    try { 
    System.in.wait(5) //Just an example 
    } catch (InterruptedException exception) { 
    exception.printStackTrace(); 
    throw exception; 
    } 
} 

Usted debe leer sobre las excepciones comprobadas para más detalles.

(Una vez dicho esto, llamando wait() en System.in casi seguro que no está haciendo lo que usted espera que ...)

+0

@Downvoter: ¿Me importa explicarme? –

+0

O bien, podría ocuparse de la excepción en el bloque 'catch'. De todos modos, una buena explicación de cómo funcionan las excepciones. – amphetamachine

+0

¡Muchas gracias! Eso realmente ayudó: D – fireshadow52

0

InterruptedException no es un RuntimeException lo que debe ser capturado o marcada (con una cláusula throws en la firma del método). Solo puede lanzar una RuntimeException y no ser forzado por el compilador a atraparla.

+0

Bueno, no del todo, puedes declarar que vas a tirarlo para obligar al * que llama * a atraparlo o volver a lanzarlo. –

+0

Mencioné que en la primera oración, mi segunda oración debería decir "... y no ser forzado por el compilador a 'manejarla'". Eso hubiera sido más claro. –

3

Hay dos tipos de excepciones en Java: marcada y sin marcar excepciones.

Para las excepciones comprobadas, el compilador comprueba si su programa las maneja, ya sea captándolas o especificando (con una cláusula throws) que el método en el que podría ocurrir la excepción, que el método arrojaría ese tipo de excepción.

Las clases de excepción que son subclases de java.lang.RuntimeException (y RuntimeException en sí) son excepciones no marcadas. Para esas excepciones, el compilador no realiza el control, por lo que no es necesario que los capture o especifique que puede arrojarlos.

La clase InterruptedException es una excepción marcada, por lo que debe atraparla o declarar que su método podría arrojarla. Usted está lanzando la excepción del bloque catch, por lo que debe especificar que el método podría tirarlo:

public void invalid() throws InterruptedException { 
    // ... 

clases de excepción que se extienden java.lang.Exception (excepto RuntimeException y subclases) son excepciones comprobadas.

Consulte Sun's Java Tutorial about exceptions para obtener información detallada.

+0

Puede valer la pena mencionar que también puede lanzar instancias de clases no Exception derivadas de Throwable. Estas son excepciones pero no excepciones :) –

+0

@Jon, sí, pero ese es un tema más avanzado que va más allá de lo que el afiche pregunta, no quería hacer de este un curso completo sobre excepciones en Java ... – Jesper

Cuestiones relacionadas