你的位置:首页 > 操作系统

[操作系统]明明已经执行Log.i,偏偏打不出日志


Android内打日志用的当然是Log.i(tag,string),调试时的日志输出可以很快的反映一些问题,方便我们跟进。

但是如果连日志都打不出来了怎么办呢,我今天就遇到了比较坑的问题。项目里别的日志都输出正常,偏偏我写的Log.i没有打印出东西,过滤器,进程,什么的,都设置好了,日志死活出不来。

无奈,开启单步调试,发现Log.i是执行了的,执行后还是没有日志。怎么办呢?

只能出大招了,反编译自己的包,看看编译器到底对我的代码做了什么。果然就看到了编译器使的坏。

下面是源代码。

for (Map.Entry<String, String> entry : map.entrySet()) {  Log.i("android", entry.getValue()) ;}

将map里的所有value输出来,很正常。但是编译器会把它弄成这样。

Iterator i$ = map.entrySet().iterator();while(i$.hasNext()) {  Entry entry = (Entry) i$.next() ;  Log.i("android", (String)entry.getValue()) ;}

看上去似乎也很正常,但是仔细查看上下文发现。我的entry.getValue是一个ArrayList,将ArrayList强转成String是不能成功的,所以,这个日志输出的语句就失败了。

 

然后,显式的调用Log.i("android", entry.getValue())就可以解决问题了。

我其实很不解为什么会编译成强转,而不是调用toString。