web-dev-qa-db-fra.com

Sortie d'exception.getMessage () avec le nom de classe

J'essaie de résoudre un problème, dans mon application, j'ai ce code

try {
  object1.method1();
} catch(Exception ex) {
   JOptionPane.showMessageDialog(nulll, "Error: "+ex.getMessage());
}

et object1 ferait quelque chose comme ça:

public void method1() {
   //some code...
   throw new RuntimeException("Cannot move file");
}

Je reçois un message dans mon volet d'options comme ceci: Error: Java.lang.RuntimeException: Cannot move file

mais j'ai utilisé la méthode getMessage et non toString, donc le nom de la classe ne devrait pas apparaître, non?

Qu'est ce que je fais mal? J'ai déjà essayé avec beaucoup d'exceptions, même Exception lui-même. Je cherche à résoudre ce non sans avoir besoin d'implémenter ma propre sous-classe Exception

PROBLÈME RÉSOLU - merci à tous!

L'essai et la capture étaient en fait appelés dans la méthode get () de SwingWorker qui construit un ExecutionException avec mon exception levée de doInBackground () J'ai corrigé cela :

@Override
protected void done() {
    try {
        Object u = (Object) get();
        //do whatever u want
    } catch(ExecutionException ex) {
        JOptionPane.showMessageDialog(null, "Error: "+ex.getCause().getMessage());
    } catch(Exception ex) {
        JOptionPane.showMessageDialog(null, "Error: "+ex.getMessage());
    }
}
28
fredcrs

Je pense que vous enveloppez votre exception dans une autre exception (qui n'est pas dans votre code ci-dessus). Si vous essayez ce code:

public static void main(String[] args) {
    try {
        throw new RuntimeException("Cannot move file");
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage());
    }
}

... vous verrez une fenêtre contextuelle qui dit exactement ce que vous voulez.


Cependant, pour résoudre votre problème (l'exception encapsulée), vous devez accéder à l'exception "root" avec le message "correct". Pour ce faire, vous devez créer une propre méthode récursive getRootCause:

public static void main(String[] args) {
    try {
        throw new Exception(new RuntimeException("Cannot move file"));
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null,
                                      "Error: " + getRootCause(ex).getMessage());
    }
}

public static Throwable getRootCause(Throwable throwable) {
    if (throwable.getCause() != null)
        return getRootCause(throwable.getCause());

    return throwable;
}

Remarque: décompresser des exceptions comme celle-ci, cependant, brise les abstractions. Je vous encourage à découvrir pourquoi l'exception est encapsulée et à vous demander si cela a du sens.

29
dacwe

Je suppose que vous avez quelque chose dans method1 Qui encapsule une exception dans une autre, et utilise la toString() de l'exception imbriquée comme message de l'encapsuleur. Je vous suggère de prendre une copie de votre projet et d'en supprimer autant que vous le pouvez tout en conservant le problème, jusqu'à ce que vous ayez un programme court mais complet qui le démontre - à quel point soit il sera clair ce qui se passe, ou nous serons en meilleure position pour aider à le réparer.

Voici un programme court mais complet qui montre que RuntimeException.getMessage() se comporte correctement:

public class Test {
    public static void main(String[] args) {
        try {
            failingMethod();
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }       

    private static void failingMethod() {
        throw new RuntimeException("Just the message");
    }
}

Sortie:

Error: Just the message
6
Jon Skeet