【问题标题】:getMessage() on Exception object does not provides nullException 对象上的 getMessage() 不提供 null
【发布时间】:2017-06-01 07:57:25
【问题描述】:

使用这样的代码

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

查看BF之间的区别

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

似乎对于B的情况,当没有指定消息时,getMessage()方法提供了格式 className: cause.getMessage() 但我希望有一个 null 值(就像 F 的情况一样)。

如果我在仅提供cause 而不是message 而创建的异常上调用getMessage,是否有办法获得null 值(如F)?

【问题讨论】:

    标签: java exception null getmessage


    【解决方案1】:

    看看Exception's JavaDoc。对于只接受Throwable的构造函数:

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

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

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

    【讨论】:

    • 我用一个简单的方法来编辑主消息来处理这个行为。这可能不是最好的方法,但对我来说效果很好。
    • 哦,好吧,我总是用正确的解决方案编辑主要问题(明确表示这是对第一个问题的编辑)。我将回复添加为不同的回复。希望现在更好
    【解决方案2】:

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

    public static String getMessageOrNull(Throwable t) {
        String message = t.getMessage();
    
        if (t.getCause() != null && message.equals(t.getCause().toString())) {
            message = null;
        }
    
        return message;
    }
    

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

    【讨论】:

      【解决方案3】:

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

      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);
          }
      }
      

      以后使用起来会更简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多