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()而不是自己滚动