Est-il un moyen de lancer une exception sans ajouter le jette déclaration?
J'ai la situation suivante.
J'ai une Classe Java qui hérite d'une autre classe de base et remplace une méthode.
La méthode de base ne permet pas de lancer des exceptions et n'a donc pas throws ...
déclaration.
Maintenant ma propre méthode devrait être en mesure de jeter l'exception mais j'ai soit le choix de
- Avaler l'exception
- Ajouter un lève déclaration
À la fois un pas satisfaisant parce que le premier serait ignorer en silence l'exception (ok, j'ai pu effectuer des coupes) et la deuxième serait de générer des erreurs de compilation à cause de la méthode des en-têtes.
public class ChildClass extends BaseClass {
@Override
public void SomeMethod() {
throw new Exception("Something went wrong");
}
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez jeter décoché exceptions sans avoir à déclarer que si vous le voulez vraiment. Décochée exceptions étendre
RuntimeException
. Throwables qui s'étendentError
sont également décoché, mais devrait être utilisé seulement pour vraiment sérieux problèmes (comme invalide bytecode).Comme un cas spécifique, Java 8 ajouté
UncheckedIOException
pour l'emballage et le renvoi desIOException
.Voici une astuce:
throws
déclarations.Une troisième option est d'opter pour la exception de la vérification (tout comme la Norme API en elle-même a faire parfois) et l'enveloppe de l'objet d'une exception dans un
RuntimeException
:Vous pouvez utiliser une sous-classe spécifique de
RuntimeException
.Je veux juste faire ajouter une alternative réponse, purement comme un FYI:
Oui, il y a un moyen de jeter un checked exception sans ajouter le
throws
déclaration, à l'aide de lasun.misc.Unsafe
classe. Ceci est décrit dans le blog suivant:Jetez un checked exception à partir d'une méthode sans la déclarer
Exemple de code:
Cependant, ce n'est pas recommandé. Il est préférable d'envelopper dans un décoché exception comme indiqué dans les uns des autres réponses.
Unsafe
.Pourquoi ne pas jeter un décoché exception? Cela n'a pas à être déclarée.
Deux alternatives sont
final
et le compilateur de savoir qui a vérifié les exceptions que vous pourriez avoir pris.Le plus tard est plus utile lorsque vous lancer une exception de contrôle dans votre code et l'attraper dans votre code d'appel, mais les couches inbetween ne sais rien à propos de l'exception.
try
bloc sont déclarées comme jeter quelques différents checked exceptions, la capture et le renvoi desException
serait plus propre que de l'attraper et de renvoi de chaque individu d'exception à l'intérieur des méthodes de pourrait lancer, mais à moins que l'on puisse "secrètement" rethrow je ne sais pas comment faire le compilateur tolérer un fourre-et-rethrow deException
.finally
bloc à savoir si letry
bloc réussi (entre autres choses, il peut être approprié de supprimer une exception qui se produit dans lefinally
bloc si et seulement si letry
bloc a également lancé une exception--un modèle utilisé par Java lui-même dans le try-with-resources). Le code de poignée qui devrait être agnostique pour le type de l'exception en cause; cela ressemble à de la version 6 de Java, il peut être.Oui, il y a un pourquoi, mais il n'est pas recommandé, vous pouvez utiliser :
Cette méthode lève vérifié exception, mais votre code pas obligé de l'attraper ou de renvoyer il. Tout comme exception d'exécution.
Voici un exemple pour l'interception vérifié les exceptions et les emballer dans un décoché exception:
vous pouvez intercepter l'exception avec bloc try - catch dans votre méthode substituée.
ensuite, vous n'avez pas besoin de déclarer lancers - déclaration.
Vous pouvez utiliser n'importe quelle exception dérivé de RuntimeException ou RuntimeException lui-même
ou
utiliser un try-bloc de l'exception de jeter le code de poignée et il y