2010-03-19 6 views
3

Je viens snippet a vu un code comme ceci:mise en œuvre de la méthode pour ce cas en Java

private static class DefaultErrorHandler<RT> implements ErrorHandler<RT> { 
    public RT handle(Object[] params, Throwable e) { 
    return Exceptions.throwUncheckedException(e); 
    } 
} 

Maintenant, je me demande ce que la méthode statique throwUncheckedException (Throwable e) retournerait exactement et comment il pourrait être mis en œuvre en ce qui concerne les médicaments génériques.

Quelqu'un peut-il me donner un exemple?

+1

Donc vous voulez retourner une valeur ** et ** jeter une exception non vérifiée? – Jeremy

+0

Ouais. Lors de l'exécution, une exception est toujours levée, tandis que la valeur de retour est de shush le compilateur. – Yardena

Répondre

1

je dois deviner qu'il se compose de:

throw new RuntimeException(e);

mais vraiment, je suppose que la valeur de retour est juste pour le spectacle. La méthode s'appelle 'lancer'.

S'il renvoie quelque chose, il retourne quelque chose de type 'RT', quel qu'il soit.

4

Vous définirait la méthode comme ceci:

public static <T> T throwUncheckedException (Throwable e) { ... } 

qui signifie essentiellement "pour tout type T, retournez-le." Ensuite, vous comptez sur the compiler's ability to guess que T = RT.

Je pense que l'idée de renvoyer une valeur à partir de la méthode throwUncheckedException est la suivante: vous voulez appeler une méthode qui lève toujours une exception d'exécution, et vous l'appelez à partir d'une méthode non vide. Le compilateur Java se plaint que l'appelant a besoin d'une instruction return à la fin de chaque branche d'exécution. Cette astuce vous évite le besoin d'un "retour factice". La méthode throwUncheckedException() renvoyant quelque chose permet d'éviter une ligne supplémentaire dans une méthode appelante qui a besoin d'une valeur de retour.

0

Had A l'exception été jeté directement à partir de la méthode de la poignée comme suit:

public RT handle(Object[] params, Throwable e) { 
    throw new RuntimeException(e); 
} 

La déclaration de retour n'aurait pas été nécessaire (il aurait même été illégale en fait) parce que le compilateur serait en mesure de savoir que toute déclaration suivant le lancer serait inaccessible. Mais puisque le lancement est effectué dans une autre méthode, et qu'une valeur de retour est requise pour la méthode du handle, un statememt de retour doit être ajouté. Le fait que throwUncheckedException() renvoie quelque chose permet à l'appel d'être dans l'instruction return.

Le throwUncheckedException() doit être quelque chose près de:

public static <T> T throwUncheckedException(Throwable e) { 
    throw new RuntimeException(e); 
    return null; 
} 

à mon humble avis, le fait que ce qui a soulevé votre question montre qu'il est trop déroutante pour être digne. Peut-être une meilleure façon d'atteindre le même objectif serait quelque chose comme ceci:

public RT handle(Object[] params, Throwable e) { 
    throw Exceptions.makeUncheckedException(e); 
}