当前位置: 首页 > news >正文

java exception message_Java 如何摆脱Exception.getMessage()输出带类名

问题

如下所示,exception.getMessage() 输出的信息带上了Class name。这样就会一直携带,看着不太舒服。

com.xxx.api.RealTimeException: com.xxx.api.RealTimeException: scp: SNAPHOT.jar: Permission denied

分析

这个类名应该来自于exception的转换 嵌套

这里日志打印出来是 java.util.concurrent.ExecutionException 异常携带的信息。

那么java.util.concurrent.ExecutionException 这个异常是来自于Future。

可以看到 Future.get 调用了report,这里会处理异常。

private V report(int s) throws ExecutionException {

Object x = outcome;

if (s == NORMAL)

return (V)x;

if (s >= CANCELLED)

throw new CancellationException();

throw new ExecutionException((Throwable)x);

}

再顺着 new ExecutionException构造器,一直找到 Throwable的构造器

public Throwable(Throwable cause) {

fillInStackTrace();

detailMessage = (cause==null ? null : cause.toString());

this.cause = cause;

}

这里就很显然,如果Exception子类使用 这个构造器,那么detailMessage 会取上一个 exception的.toString。而不是getMessage:

//Throwable

public String toString() {

String s = getClass().getName();

String message = getLocalizedMessage();

return (message != null) ? (s + ": " + message) : s;

}

解决

如果是ExecutionException异常,则取cause的Message,就不会有类名。这里假设cause 类是一个没有再包裹其他exception的直接异常。

一般Exception的 message本身就不会带有类名,子类也不会有。

try {

future.get();

} catch (Exception e) {

if (e instanceof ExecutionException) {

e = (Exception) e.getCause();

}

throw new RealTimeException(-1, e.getMessage());

}

相关文章:

  • dropzone java多文件_java zyUpload 实现多文件上传
  • linux ttyusb读写_如何在Linux上找到所有串行设备(ttyS,ttyUSB,..)而不打开它们?
  • 我的世界java无限水_我的世界:一桶水变成“无限水”的11种方法!真正属于老mc的技术...
  • 怎样把java降至7_JDK1.8降到1.7技巧
  • java中byte数组为参数,JAVA:PBEKeySpec带有字节数组参数,而不是ASCII
  • android休眠唤醒java_android的休眠和唤醒流程
  • java入门 helloworld_java入门篇1--- helloworld
  • python 字典属于_Python字典
  • java共享一个参数_java只有值传递(共享传递)
  • java中mouseMoved_Java – Swing中的mouseMoved()事件处理
  • php的hashmap,php如何实现hashmap
  • php创建表格,php 创建表
  • php 执行流程图,PHP底层设计及执行流程
  • java 过期缓存,带有过期密钥的Java基于时间的映射/缓存
  • php中两个变量都是string_内容也一样但是长度不一样,php基础知识期末考试题无答案...