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());
}
}
Ответы
Ответ 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