java空指针处理例子_被同事的空指针硬生生的折磨了好久,终于学会了如何处理空指针...
每天早上七點(diǎn)三十,準(zhǔn)時(shí)推送干貨
阿粉入職這么久了,無(wú)論如何也不會(huì)想到會(huì)被自己同事寫(xiě)的一個(gè)接口返回的空指針異常折磨致死,折磨的死去活來(lái),卻完全不知道是什么原因,你有沒(méi)有過(guò)這種經(jīng)歷呢?
NullPointerException
標(biāo)題醒目,是為了給大家說(shuō),這個(gè)空指針異常,說(shuō)實(shí)話,在項(xiàng)目里面很多都是很容易能夠解決的,但是有時(shí)候發(fā)生問(wèn)題的原因卻是你無(wú)論如何想不到的,事情是這個(gè)樣子的。
前端代碼如下:
var?setting?=?{????????????????url:"findFileById",????????????????data:{????????????????????id:id????????????????},????????????????success:function?(data)?{????????????????????console.log(data);????????????????},????????????????error:function?(data)?{????????????????????console.log("查詢文件異常")????????????????}????????????}ajax(setting);ajax在這里只是進(jìn)行了一個(gè)封裝function?ajax(setting)?{????$.ajax({????????type:"post",????????url:setting.url+".do",????????dataType:setting.dataType||"json",????????contentType:"application/json;utf-8",????????data:JSON.stringify(setting.data)||{},????????async:setting.async,????????success:function?(data)?{????????????setting.success(data);????????},????????error:function?(data)?{????????????setting.error("接口出錯(cuò),請(qǐng)重試");????????}????})
后臺(tái)業(yè)務(wù)處理如下:
@PostMapping("findFileById")@ResponseBodypublic?File?findFileById(HttpServletRequest?request,?HttpServletResponse?response,?@RequestBody?Map?map){????return?deliverFileService.findFileById(request,map);}
大家肯定會(huì)說(shuō),這么簡(jiǎn)單的事情你都不會(huì),阿粉你干啥吃的,一個(gè)查詢文件都有問(wèn)題,而事實(shí)上,在代碼里面我的同事也沒(méi)有完全去處理這個(gè)空值的問(wèn)題,結(jié)果導(dǎo)致一直都出在ajax里面出現(xiàn)“接口出錯(cuò),請(qǐng)重試”的錯(cuò)誤。
而問(wèn)題就在于他沒(méi)有處理空的數(shù)據(jù),而直接就返給我了,這種問(wèn)題也是非常的奇怪,很多時(shí)候不都是應(yīng)該處理一下空的數(shù)據(jù)為防止NULL的異常么?而阿粉也第一時(shí)間找到了他,他說(shuō)沒(méi)問(wèn)題,在他那里正常調(diào)用,我當(dāng)時(shí)就尷尬了,我給你傳遞的參數(shù)是沒(méi)問(wèn)題的,查詢數(shù)據(jù)如果為空,應(yīng)該會(huì)有提示的才對(duì)。于是阿粉只能是簡(jiǎn)單的修改了一下他的代碼,變成了
@PostMapping("findFileById")@ResponseBodypublic?File?findFileById(HttpServletRequest?request,?HttpServletResponse?response,?@RequestBody?Map?map){????return?deliverFileService.findFileById(request,map)!=?null??deliverFileService.findFileById(request,map)?:?new?;?new?DeliverFile();}
阿粉不能給他改動(dòng)太大,只能改成我這里調(diào)用如果是 null的時(shí)候,返還給我一個(gè)空對(duì)象就好了,如果不是的話,就把查詢回來(lái)的數(shù)據(jù)完整的返還給我。
那么阿粉現(xiàn)在就來(lái)說(shuō)說(shuō)這個(gè)如何處理我們的空值的問(wèn)題,不然以后你如果寫(xiě)好的數(shù)據(jù)接口,給別人調(diào)用,調(diào)用出來(lái)如果是個(gè)空的字符串也就罷了,但如果像是null這種不處理的東西,那么一定會(huì)被別人鄙視死。
如何處理空指針異常的問(wèn)題
什么時(shí)候出現(xiàn)NullPointerException?
我們都知道 NullPointerException 是繼承 RuntimeException 的,也就是運(yùn)行的時(shí)候會(huì)出的異常信息,當(dāng)我們寫(xiě)代碼的時(shí)候,如果代碼在運(yùn)行的時(shí)候,我們使用的對(duì)象沒(méi)有初始化的時(shí)候,或者是為空的時(shí)候,就會(huì)出現(xiàn)空指針的異常,而這個(gè)異常也是我們感覺(jué)最 Low 的,最不可能出現(xiàn)的異常,但是往往因?yàn)樽约旱牟蛔⒁?#xff0c;就出現(xiàn)了。
其實(shí)這個(gè)辦法可就太多了,而很多時(shí)候我們也是不去注意這個(gè)事情的,就比如說(shuō)對(duì)象,判空操作,但是你如果在每個(gè)對(duì)象使用的時(shí)候都判空,那么你的代碼真的就會(huì)出現(xiàn):
if(a!=null){????if(b!=null){????????if(c!=null){????????????....????????}????}}
當(dāng)你看到這種代碼的時(shí)候,第一感覺(jué)有沒(méi)有直接想把這個(gè)朋友拉過(guò)來(lái)捶一頓,這種要是寫(xiě)多了,人都快瘋了,尤其是二次維護(hù)的人員。
其實(shí)這種方法雖然笨,但是也算是一個(gè)習(xí)慣,判空,對(duì)功能上來(lái)說(shuō),肯定是不會(huì)出現(xiàn)很多麻煩,但是這么個(gè)空值也是很折磨人的,那么我們就來(lái)處理一下他吧。
1.這個(gè)我們就不說(shuō)了直接判斷對(duì)象是不是為空就行了。
第二個(gè),就是比對(duì)equals方法的時(shí)候,我們很多時(shí)候的寫(xiě)作習(xí)慣就是這種
if(text.equals("xxxxx")){????}
其實(shí)這么比對(duì)沒(méi)有問(wèn)題,但是你有沒(méi)有想過(guò),如果說(shuō)你的text是個(gè)空呢?你比對(duì)的時(shí)候不就出錯(cuò)了?而曾經(jīng)也有一個(gè)面試官問(wèn)我,為什么在筆試題里面去把已知的字符串寫(xiě)在前面,當(dāng)時(shí)可能只是一種習(xí)慣,而后來(lái)卻發(fā)現(xiàn)這是真的有用滴。
你改成:
if("xxxxx".equals(text)){????}
就會(huì)避免了出現(xiàn)空指針的錯(cuò)誤了,多好的習(xí)慣不是么?
第三個(gè),也是我們?cè)贘ava8里面提供的特性O(shè)ptional
ofNullable,就是Optional中提供的,將我們需要的參數(shù)傳遞過(guò)去,就可以判斷是否為空了。
而對(duì)于集合來(lái)說(shuō),大家就可以使用之前修改的那個(gè)方法,判斷是否為null,如果是null,那么我們一定要返回一個(gè)哪怕是空對(duì)象,或者是一個(gè)空的集合,這樣對(duì)于之后調(diào)用你接口的人來(lái)說(shuō),也是非常友善的。
我知道很多人會(huì)說(shuō),那我在接口上面寫(xiě)上個(gè)注釋,查詢返回的值會(huì)有可能是個(gè)空,大家小心調(diào)用,雖然你提示了問(wèn)題,但是你這是沒(méi)有解決問(wèn)題的體現(xiàn)呀,就相當(dāng)于,你把所有的異常全部都拋出去了,而沒(méi)有去處理他。
我們這時(shí)候還可以使用 Java8 里面提供的 Optional ,比如這個(gè)樣子
OptionalgetProductOptional(String?id)
這個(gè)時(shí)候,當(dāng)我們的調(diào)用者知道有 Optional 的存在的時(shí)候,自然而然的明白了。
關(guān)于處理null,你還有其他的好的方式么?
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java空指针处理例子_被同事的空指针硬生生的折磨了好久,终于学会了如何处理空指针...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java静态类和非静态类_关于java:
- 下一篇: 本地生活JAVA版本_赶集生活java版