Java 异常 getMessage() returns 空

Java Exception getMessage() returns null

在尝试将 JSON 反序列化为对象时,我发现了一个 SAXParsingException,它看起来像这样。写出内存所以它可能不是 100% 正确,但想法是一样的。

try {
      validator.validate(source);
      return Response.ok(jsonResponse).build();
    } 
     catch (SAXParseException format) {
       String exceptionStr = format.getMessage();
       exceptionStr = mapper.writeValueAsString(exceptionStr);
       return Response.status(Response.Status.BAD_REQUEST).entity(exceptionStr).build();
    }

但是 getMessage() return 为空。但是,如果我只是 return

return Response.status(Response.Status.BAD_REQUEST).entity(format).build();

然后它 return 看起来像这样的堆栈跟踪(我已经裁剪掉了大部分堆栈跟踪,因为它很长)

   {
"cause": {
    "cause": {
        "stackTrace": [

            {
                "methodName": "run",
                "fileName": "Thread.java",
                "lineNumber": 745,
                "className": "java.lang.Thread",
                "nativeMethod": false
            }
        ],
        "lineNumber": 0,
        "columnNumber": 0,
        "message": "cvc-complex-type.2.4.b: The content of element 'Request' is not complete. One of '{\"blahblahblah":echoData, \"blahblahblah":schemeCode}' is expected.",
        "localizedMessage": "cvc-complex-type.2.4.b: The content of element 'Request' is not complete. One of '{blahablah":echoData, \"blahbblahblah":schemeCode}' is expected."
    },

那么,如果有一条消息附加到异常,为什么 getMessage() return 为 null?

您获取的序列化对象来自异常cause,消息仍然为空。 Java 异常,因为 SAXParseException 通常包含消息字段和 cause exception,在这种情况下是另一个异常问题的根源。

您可能对找到根本原因消息的使用 org.apache.commons.lang3.exception.ExceptionUtils.getRootCauseMessage/getRootCauseStackTrace 感兴趣(在您的示例中也可能是您的原因本身有原因)

正如其他人所说,我需要

字符串异常Str = format.getException().getCause().getMessage();

因为我的 'Message' 嵌套在其他元素中。 谢谢大家

除了你提到的解决方案,在这种情况下,检查异常传播并修复它可能是个好主意,这样 'message' 就不会在顶层丢失(即如果你控制底层异常处理)