2010-05-28 7 views
7

Pourquoi ne pouvez-vous jeter un InterruptedException de la manière suivante:exception jet

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; 
} 

Je suis allé à http://java24hours.com, mais il ne m'a pas dit pourquoi je ne pouvais pas jeter un InterruptedException.
Si quelqu'un sait pourquoi, s'il vous plaît dites-moi! Je suis désespéré! : S

+0

Quel genre d'erreur obtenez-vous? – Simon

+0

Il est dit: exception non signalée java.lang.InterruptedException; doit être attrapé ou déclaré comme étant lancé – fireshadow52

Répondre

13

Vous ne pouvez le lancer que si la méthode que vous écrivez déclare qu'elle lève InterruptedException (ou une classe de base).

Par exemple:

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; 
    } 
} 

Vous devriez lire sur vérifié exceptions pour plus de détails.

(Cela dit, appelant wait() sur System.in presque fait certainement pas ce que vous attendez à ...)

+0

@Downvoter: Vous voulez vous expliquer? –

+0

Ou, il pourrait gérer l'exception dans le bloc 'catch'. Quoi qu'il en soit, une bonne explication du fonctionnement des exceptions. – amphetamachine

+0

Merci beaucoup! Cela a vraiment aidé: D – fireshadow52

0

InterruptedException est pas un RuntimeException il doit être pris ou vérifié (avec une clause throws sur la signature de la méthode). Vous ne pouvez lancer qu'une exception RuntimeException et ne pas être forcé par le compilateur à l'attraper.

+0

Eh bien, pas tout à fait - vous pouvez déclarer que vous allez le lancer pour forcer l '* appelant * à l'attraper ou à le rebaser. –

+0

J'ai mentionné que dans la première phrase, ma deuxième phrase devrait se lire "... et ne pas être forcé par le compilateur à" gérer "." Cela aurait été plus clair. –

3

Il existe deux types d'exceptions dans Java: coché et non cochées exceptions. Pour les exceptions vérifiées, le compilateur vérifie si votre programme les gère, soit en les interceptant, soit en spécifiant (avec une clause throws) que la méthode dans laquelle l'exception peut se produire, que la méthode puisse déclencher ce type d'exception.

Les classes d'exception qui sont des sous-classes de java.lang.RuntimeException (et RuntimeException elle-même) sont des exceptions non contrôlées. Pour ces exceptions, le compilateur n'effectue pas la vérification - vous n'avez donc pas besoin de les attraper ou de spécifier que vous pourriez les lancer.

La classe InterruptedException est une exception vérifiée, vous devez donc l'attraper ou déclarer que votre méthode pourrait le lancer. Vous jetez l'exception du bloc catch, vous devez spécifier que votre méthode pourrait jeter:

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

classes d'exception qui se prolongent java.lang.Exception (sauf RuntimeException et sous-classes) sont vérifiés exceptions.

Pour plus d'informations, consultez le document Java Tutorial about exceptions de Sun.

+0

Il peut être utile de mentionner que vous pouvez également lancer des instances de classes non-Exception dérivées de Throwable. Ce sont des exceptions mais pas des exceptions :) –

+0

@Jon, oui, mais c'est un sujet plus avancé qui va au-delà de ce que l'affiche me demande, je ne voulais pas en faire un cours complet sur les exceptions en Java ... – Jesper

Questions connexes