0

使用这样的代码

public static void main(String[] args) {
    Exception one = new Exception("my cause");
    System.out.println("A) " + one.getMessage());

    System.out.println();

    Exception two = new Exception(one);
    System.out.println("B) " + two.getMessage());
    System.out.println("C) " + two.getCause().getMessage());

    System.out.println();

    Exception three = new Exception("my message", one);
    System.out.println("D) " + three.getMessage());
    System.out.println("E) " + three.getCause().getMessage());

    System.out.println();

    Exception fourth = new Exception(null, one);
    System.out.println("F) " + fourth.getMessage());
    System.out.println("G) " + fourth.getCause().getMessage());
}

输出是这个

A) my cause

B) java.lang.Exception: my cause
C) my cause

D) my message
E) my cause

F) null
G) my cause

B查看和之间的区别F

在这两种情况下,我都没有提供消息,但不同之处在于,在这种B情况下,null值不是强制的。

似乎对于这种B情况,当未指定消息时,该getMessage()方法提供了格式 className: cause.getMessage() 但我除了有一个null值外(就这种F情况而言)。

如果我在已创建的异常上调用仅提供而不提供的异常,有没有办法获得null价值(例如) ?FgetMessagecausemessage

4

3 回答 3

3

看看Exception's JavaDoc。对于只需要 a 的构造函数Throwable

构造一个具有指定原因和详细消息的新异常(cause==null ? null : cause.toString())(通常包含 的类和详细消息cause)。此构造函数对于仅是其他可抛出对象(例如PrivilegedActionException)的包装器的异常非常有用。

因此,在您的 B 情况下,由于原因不为空,因此您将 的值cause.toString()作为容器异常的消息。

如果该构造函数用于创建异常,那么当您捕获异常时,为时已晚 - 它已经具有如上所述的详细消息。您无法获得“null”,因为详细消息不为空。您可以将其与原因进行比较toString()并推断它应该为空,但这是一个杂凑,理论上,原因的信息可能会随着时间的推移而变化,并且在捕获时会有所不同。

于 2017-06-01T08:02:48.043 回答
0

根据@RealSkeptic 的回复,我创建了一个这样的方法

public static String getMessageOrNull(Throwable t) {
    String message = t.getMessage();

    if (t.getCause() != null && message.equals(t.getCause().toString())) {
        message = null;
    }

    return message;
}

这可能不是最好的方法,但对我来说效果很好。

于 2017-06-01T10:06:59.923 回答
0

您可以简单地以相同的方式构建它,将其隐藏在静态方法中:

public static Exception getException(Throwable cause){
    return new Exception(null, cause);
}

或者您定义自己的类,该类将使用Exception(String, Throwable)构造函数,例如

public MyExceptoin extends Exception{

    public MyException(Throwable cause){
        super(null, cause);
    }
}

这样以后使用起来会更简单。

于 2017-06-01T10:56:53.970 回答