這個異常相信大家一定非常眼熟,相信在每人的程序開發生涯中都遇到過。在這次高校3.1的開發中,這樣的錯又這樣被拋出來了。這是一個小bug,但遇到它,它就能讓你噁心半天,因爲的程序會因此掛起,不再提供正常的服務。
在基礎開發對外服務接口的時候,經常遇到服務異常,其他系統在調用接口的時候,時而不能正常提供數據。然後我就去jboss上去翻看server.log,發信有報java.lang.NullPointerException的錯,然後以java.lang.NullPointerException計數,查到481處同樣的錯誤。
究其原因,在開發接口實現的時候,方法的返回值沒有判斷null值直接返回
看兩個比較典型方法實現
lstStudent = studentBean.queryStudentAll();
List fields = new ArrayList();
ObjectToMap otm = new ObjectToMap();
fields= Arrays.asList(Student.class.getFields()) ;
List<Map<Serializable, Serializable>> list = otm.convertToMap(fields, lstStudent);//在使用ObjectToMap.convertToMap() 方法前沒有判斷
return list;
以上的lstStudent在利用ObjectToMap.convertToMap()方法的時候,沒有判斷它是否爲null,就直接進行了轉換,一旦爲null值,返回值list也就爲null,便導致了該錯的出現。
public List<Map<Serializable, Serializable>> queryColleageNamesByIds(
List<String> colleageIds, String dataBaseName) {
List<Map<Serializable, Serializable>> listMapInstitution = new ArrayList<Map<Serializable, Serializable>>();
List<Institution> listInstitution= new ArrayList<Institution>();
listInstitution=institutionEao.queryByList(colleageIds, dataBaseName);
if (listInstitution != null || listInstitution.size() > 0
|| listInstitution.get(0) != null) {
EntityToMap entityToMap = new EntityToMap();
listMapInstitution = entityToMap.entityToMap(listInstitution);
return listMapInstitution;
} else {
return null;//至少應該返回 new List<Map<Serializable, Serializable>>,這樣不至於報java.lang.NullPointerException異常
}
}
該方法的錯誤很明顯,如果查詢不到就直接乾脆返回了一個null.至少應該返回 new List<Map<Serializable, Serializable>>,這樣不至於報java.lang.NullPointerException異常.
翻看之前的學習記錄,發現一些對null和""的方法總結,再拿出來分享一下,希望以後不再被java.lang.NullPointerException所困擾
假如現在要對一個name對象,我們往往習慣了這樣寫
if (name =="") {
//do something
}
或者這樣寫:
if(name.equals("")) {
//do something
}
前者,初學者最容易犯,也最不容易被發現的錯誤,因爲它們的語法本身沒問題,Java編譯器編譯時不報錯。但這種條件可能在運行時導致程序出現bug,永遠也不會爲true,也就是時說,if塊裏的語句永遠也不會被執行。
後者,包括很多Java熟手也很容易犯的錯誤,爲什麼是錯誤的呢?也許你會感到納悶。
對,它們的寫法本身沒錯,但是,少了一個null判斷的條件,試想,如果name=null的情況下,會發生什麼後果呢?後果是,你的程序將拋出NullPointerException異常,系統將被掛起,不再提供正常服務。
當然,如果之前已經對name作了null判斷的情況例外。
正確的寫法應該先加上name != null的條件,如例:
if(name!= null && !name.equals("")) {
//do something
}
或者
if(!"".equals(name)&& !null.equals ) {//將""寫在前頭,這樣,不管name是否爲null,都不會出錯。
//do something
}