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 lève pas d'exceptions et n'a donc pas de throws ...
déclaration.
Maintenant, ma propre méthode devrait être en mesure de lever l'exception, mais j'ai le choix entre
Les deux ne sont pas satisfaisants car le premier ignorerait silencieusement l'exception (ok je pourrais effectuer une journalisation) et le second générerait des erreurs de compilation en raison des différents en-têtes de méthode.
public class ChildClass extends BaseClass {
@Override
public void SomeMethod() {
throw new Exception("Something went wrong");
}
}
Vous pouvez lever des exceptions non contrôlées sans avoir à les déclarer si vous le souhaitez vraiment. Les exceptions non vérifiées étendent RuntimeException
. Les objets pouvant être étendus Error
ne sont pas non plus contrôlés, mais ne doivent être utilisés que pour des problèmes très graves (comme un bytecode invalide).
Dans un cas spécifique, Java 8 ajouté UncheckedIOException
pour encapsuler et relancer IOException
.
Voici une astuce:
class Utils
{
@SuppressWarnings("unchecked")
private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T
{
throw (T) exception;
}
public static void throwException(Throwable exception)
{
Utils.<RuntimeException>throwException(exception, null);
}
}
public class Test
{
public static void main(String[] args)
{
Utils.throwException(new Exception("This is an exception!"));
}
}
Une troisième option consiste à désactiver la vérification des exceptions (tout comme l'API standard elle-même doit parfois le faire) et à envelopper l'exception vérifiée dans un RuntimeException
:
throw new RuntimeException(originalException);
Vous souhaiterez peut-être utiliser une sous-classe plus spécifique de RuntimeException
.
Je veux juste ajouter une réponse alternative, uniquement en tant que [~ # ~] fyi [~ # ~] :
Oui, il existe un moyen de lever une exception vérifiée sans ajouter la déclaration throws
, en utilisant le Sun.misc.Unsafe
classe. Ceci est décrit dans le billet de blog suivant:
Lance une exception vérifiée à partir d'une méthode sans la déclarer
Exemple de code:
public void someMethod() {
//throw a checked exception without adding a "throws"
getUnsafe().throwException(new IOException());
}
private Unsafe getUnsafe() {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
return (Unsafe) field.get(null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Cependant, ce n'est pas recommandé. Il est préférable de mettre une exception non vérifiée comme indiqué dans certaines des autres réponses.
Pourquoi ne jetez-vous pas une exception non contrôlée? Cela ne doit pas être déclaré.
Deux alternatives sont
final
et le compilateur sait quelles exceptions vérifiées vous avez peut-être interceptées.Ce dernier est plus utile lorsque vous lancez une exception de vérification dans votre code et l'attrapez dans votre code appelant, mais les couches intermédiaires ne savent rien de l'exception.
Oui, il y a un pourquoi mais ce n'est pas du tout recommandé que vous puissiez utiliser:
Package Java non sécurisé
getUnsafe().throwException(new IOException());
Cette méthode lève l'exception vérifiée, mais votre code n'est pas obligé de l'attraper ou de la relancer. Tout comme l'exception d'exécution.
Voici un exemple pour intercepter les exceptions vérifiées et les encapsuler dans une exception non vérifiée:
public void someMethod() {
try {
doEvil();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
Vous pouvez utiliser n'importe quelle exception dérivée de RuntimeException ou de RuntimeException elle-même
ou
utilisez un bloc d'essai pour le code de lancement d'exception et gérez-le
vous pouvez intercepter l'exception avec le bloc try-catch dans votre méthode surchargée. alors vous n'avez pas besoin de déclarer throws- statement.