Подтвердить что ты не робот

Exception.getMessage() с именем класса

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

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

и объект1 будет делать что-то вроде этого:

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

Я получаю messsage в моей панели параметров следующим образом: Error: java.lang.RuntimeException: Cannot move file

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

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

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

Try и catch фактически вызывались в методе 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());
    }
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

Я предполагаю, что у вас есть что-то в 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