Я пытаюсь исправить проблему, в моем приложении есть этот код
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());
}
}
Я думаю, вы заключили свое исключение в другое исключение (которого нет в вашем коде выше). Если вы попробуете этот код:
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;
}
Примечание: Развертывание исключений, подобных этому, как бы разбивает абстракции. Я призываю вас выяснить, почему исключение обернуто, и спросите себя, имеет ли оно смысл.
Я предполагаю, что в 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