Android內打日誌用的當然是Log.i(tag,string),調試時的日誌輸出可以很快的反映一些問題,方便我們跟進。 但是如果連日誌都打不出來了怎麼辦呢,我今天就遇到了比較坑的問題。項目里別的日誌都輸出正常,偏偏我寫的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。