Java 类名称为的异常.getMessage()输出
我正在尝试修复一个问题,在我的应用程序中,我有以下代码Java 类名称为的异常.getMessage()输出,java,exception-handling,Java,Exception Handling,我正在尝试修复一个问题,在我的应用程序中,我有以下代码 try { object1.method1(); } catch(Exception ex) { JOptionPane.showMessageDialog(nulll, "Error: "+ex.getMessage()); } object1会做这样的事情: public void method1() { //some code... throw new RuntimeException("Cannot move
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
子类的情况下解决这个问题
问题已解决-谢谢大家强>
try-and-catch实际上是在SwingWorker的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
听起来很奇怪-你能在一个简短但完整的程序中重现这一点吗?你能在
catch
中添加e.printStackTrace()
吗?看起来@dacwe是对的。查看堆栈跟踪,我可以看出问题可能是Swing Worker…。try{}实际上是从Swing Worker方法done()调用get(),异常是在doInBackGroundIt中引发的。getRootCause方法没有受到无限递归的保护。@Perception,除非垃圾本身就是它的原因,或者你有其他超奇怪的原因循环链,否则你不必担心它。@aioobe-True,这些是需要检查的主要原因。但这并不像你想象的那么罕见。我不同意。我从未遇到过这种情况。实际上,考虑到printStackTrace
方法,即使是Throwable
-类的设计者也不会考虑这种情况。使用org.apache.commons.lang3.exception.exception.ExceptionUtils.getRootCause()而不是自己滚动