setText方法報空指針異常

今天做開發的時候發現一個TextView的setText方法報空指針異常。當時就想着是不是TextView沒有初始化,卻發現它不爲null。然後,就想着既然它不是空的,那就有可能是我傳入的值是空的咯!令人沮喪的是我發現傳入的值也不爲空!!!究其原因,最後發現因爲傳入的是ArrayList.size()方法,即傳入的值類型不對!

textView.setText(list.size());

這裏傳入的是一個int類型,而一般情況下應該是CharSequence類型。當然,你可能會想臥槽,你也它新手了把。不過我想記錄的不是類型搞錯的問題,而是爲什麼會在這上面犯錯的原因。

原因:首先,我們一般情況下setText()方法傳入的是CharSequence類型(String類型是它的一個子類)。那麼, 你有沒有考慮爲什麼它也可以傳入int類型呢?而且編譯時不報錯!!!(報錯的話,我們不就可以一眼看穿了嗎!)其原因是setText( )的重載方法中還真有一個參數類型是int類型的(納尼,怎麼會這樣)。那既然有int類型的重載方法,爲什麼還報錯呢?下面是這個方法的源碼,大家看一下應該會恍然大悟。

public final void setText(int resid) {
        throw new RuntimeException("Stub!");
    }

在上面的代碼中,從int類型的參數名你就可以猜到,它代表的是資源的id也就是常說的R文件裏面的東西。所以它也會指向一個CharSequence類型,而不是一個int類型或者其他的非CharSequence類型或者其子類。

所以,綜上所述,大家還是不要像我一樣犯低級錯誤就好了。哈哈

發佈了150 篇原創文章 · 獲贊 138 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章