Вывод exception.getMessage () с именем класса

Я пытаюсь исправить проблему, в моем приложении есть этот код

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

, и object1 будет делать что-то вроде этого:

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

Я получаю сообщение в панели параметров, подобное этому : Ошибка: java.lang.RuntimeException: невозможно переместить файл

, но я использовал getMessage , а не метод toString , поэтому имя класса не должно отображаться, верно ?

Что я делаю не так? Я уже пробовал использовать множество исключений, даже само Exception . Я хочу решить эту проблему без необходимости реализации моего собственного подкласса Exception

ПРОБЛЕМА РЕШЕНА - спасибо всем!

Попытка и отлов на самом деле вызывалась в методе get () из SwingWorker, который создает исключение ExecutionException с моим исключением, созданным из doInBackground () Я исправил это:

@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
задан javanna 31 January 2012 в 22:48
поделиться

2 ответа

Я думаю, вы заключили свое исключение в другое исключение (которого нет в вашем коде выше). Если вы попробуете этот код:

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

... вы увидите всплывающее окно, которое говорит именно то, что вы хотите.


Однако, чтобы решить вашу проблему (исключение в оболочке), вам нужно добраться до «корневого» исключения с «правильным» сообщением. Для этого вам нужно создать собственный рекурсивный метод 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;
}

Примечание: Развертывание исключений, подобных этому, как бы разбивает абстракции. Я призываю вас выяснить, почему исключение обернуто, и спросите себя, имеет ли оно смысл.

30
ответ дан 28 November 2019 в 03:37
поделиться

Я предполагаю, что в method1 есть что-то, что оборачивает одно исключение в другое и использует toString() вложенного исключения в качестве сообщения оболочки. Я предлагаю вам взять копию вашего проекта и удалить как можно больше, сохраняя проблему, до тех пор, пока у вас не появится короткая, но полная программа, демонстрирующая ее - в какой момент либо будет понятно, что происходит, либо мы будем в лучшем положении, чтобы помочь исправить это.

Вот короткая, но полная программа, которая демонстрирует, что RuntimeException.getMessage() ведет себя правильно:

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");
    }
}

Вывод:

Error: Just the message
6
ответ дан 28 November 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: