web-dev-qa-db-fra.com

Existe-t-il un moyen de lever une exception sans ajouter la déclaration throws?

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

  • Avalez l'exception
  • Ajouter une déclaration de lancers

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");
        }
}
71
Jürgen Steinblock

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.

89
OrangeDog

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!"));
    }
}
38
Eng.Fouad

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.

26
Michael Borgwardt

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.

9
dogbane

Pourquoi ne jetez-vous pas une exception non contrôlée? Cela ne doit pas être déclaré.

Deux alternatives sont

  • envelopper avec une exception vérifiée avec une non cochée.
  • ne laissez pas le compilateur savoir que vous lancez une exception vérifiée, par exemple Thread.currentThread (). Stop (e);
  • Dans Java 6, vous pouvez renvoyer l'exception s'il s'agit de final et le compilateur sait quelles exceptions vérifiées vous avez peut-être interceptées.
  • Dans Java 7, vous pouvez renvoyer une exception si elle est effectivement finale, c'est-à-dire que vous ne la modifiez pas dans le code.

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.

4
Peter Lawrey

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.

3
Ahmad Al-Kurdi

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);
   }
}
1
Jason S

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

0
fmucar

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.

0
Erhan Bagdemir