安卓程式中,遇到最多報錯,其中一種null 指標問題,null 指標說起來:好解決! 也不好解決.
好解決的是說:明顯的null 指標問題,沒有執行個體化類,控制項或者id 找錯的。都會出現null 指標問題。
不好解決的null 指標是:通常是這種情況,在一個請求裡面,又寫了一個網路請求。就相當於在一個線程裡面又開了一個線程。因為我們不能確定第一個線程是否執行完畢了,或者說執行了一半的時候,不能確保線程執行完畢的情況。當然這種情況不一定就是網路請求才會出現。也有可能是執行了非常耗時的工作。所以,不推薦在一個線程中,又開啟另一個耗時的線程。如果遇到特殊情況,非要開啟一個線程的,請確保兩個線程都能執行完畢。
遇到null 指標的問題,如何解決才是最關鍵的: 通常我們發現null 指標的問題的是,程式崩潰停止運行,通過log 日誌列印,我們可以從控制台中,直接定位到某一行,那說明就是這一行報了null 指標的問題。因為是一行代碼 :執行個體如下:
doSetLocation(res_city_id,latitude,lontitude);
像上面的這行代碼,一共傳了三個參數,既然這行報了null 指標,一定有的參數值是空的,沒有擷取到值,或者說沒有賦值成功。解決方案是:首先你可以自己確定有哪些參數是一定不為空白的,有哪些是可能為空白的。至於怎麼看,要根據實際情況來看,也可以憑藉經驗,哪一個可能為空白。
當我們不確定哪一個參數為空白的時候,就需要手動調試,而斷點調試則是我們調試手段最常用,並且是最有效一個手段。它可以幫你定位到每一個參數的傳值情況,這樣就能一步一步找出問題所在。
還有一種情況是,斷點也找不到的錯誤。因為斷點調試,直接跳出方法,不執行。這個也常見,但是也必須要解決的問題。
之前就遇到了,下面一段代碼如下:
private List<NameValuePair> params; public JSONParser(Context context,Boolean isLoginOrRegister){this.isLoginOrRegister=isLoginOrRegister;this.context=context;init();} public String makeHttpRequest2(String url, String method, String jsonStr) { try {else if (method == "GET") {// request method is GET String paramString = URLEncodedUtils.format(params, "utf-8");url += "?" + paramString;HttpGet httpGet = new HttpGet(url);} catch (Exception e) {e.printStackTrace();}return json;}
使用方式如下,當我走”GET“方法時。直接拋出null 指標異常,沒有走裡面的方法。當我定位報錯資訊時,顯示 params 報空。當時一看到這也是蒙了。因為怕什麼來什麼,網路請求經常用,但是封裝網路請求卻是不太瞭解。因為params為空白,就去找 params 在哪裡初始化,這時候,會發現。最上面的兩個構造方法,
有一個帶params的參數的構造方法,一個卻是不帶params的構造方法。而我使用的恰好是不帶params 參數的構造方法。當時我發現沒有這個參數,就把參數加上去不就可以了嗎,後來發現加上去也是錯的。
首先搞清構造方法是什嗎?構造方法是,構造方法是在你調用的時候,他就幫你執行個體化參數,或者執行個體化一些需要new 出來的類。
發現了這個,你就會發現第二個構造方法,雖然使用了params 但是卻沒有執行個體化。找到問題解決問題就很方便了。只需要在構造方法裡面執行個體化即可。不使用參數方式的執行個體化。
public JSONParser(Context context,Boolean isLoginOrRegister){ this.isLoginOrRegister=isLoginOrRegister; this.context=context; params=new ArrayList<NameValuePair>(); init(); }