android:自定义Log类工具的小坑:有时候打印不出堆栈信息的一个解决办法。

情景

在自定义库中遇到某些 RuntimeException:如 java.lang.NullPointerException。使用自定义的日志类,如“XXXLog.e(e)”。会出现无法追踪错误发生的位置(堆栈信息只打印到自定义库外面)。但是用原生的

e.printStackTrace();

方法却可以打印完整的堆栈信息,进而追踪自定义库内部的错误。

原因

很可能是自定义日志类“XXXLog”内部使用

e.fillInStackTrace();

方法配合

String msg = Log.getStackTraceString(e.fillInStackTrace());

来实现错误堆栈信息打印。这是一个坑。因为有时候 (Exception e)  中 e 用 Throwable.backtrace 变量来存储堆栈信息。

一旦调用 e.fillInStackTrace()来使用这些信息,就会导致 backtrace 变量重置(backtrace == null),表示堆栈信息已处理。此时 Log.getStackTraceString(e.fillInStackTrace()) 指向的 e 中也就没有信息了。

解决

使用

ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String msg = baos.toString();

来获取堆栈信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值