新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)「Java極客技術(shù)」,作者鴨血粉絲。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號(hào)。

目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、龍陵網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
阿粉入職這么久了,無論如何也不會(huì)想到會(huì)被自己同事寫的一個(gè)接口返回的空指針異常折磨致死,折磨的死去活來,卻完全不知道是什么原因,你有沒有過這種經(jīng)歷呢?
NullPointerException
標(biāo)題醒目,是為了給大家說,這個(gè)空指針異常,說實(shí)話,在項(xiàng)目里面很多都是很容易能夠解決的,但是有時(shí)候發(fā)生問題的原因卻是你無論如何想不到的,事情是這個(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ò),請重試");
- }
- })
后臺(tái)業(yè)務(wù)處理如下:
- @PostMapping("findFileById")
- @ResponseBody
- public File findFileById(HttpServletRequest request, HttpServletResponse response, @RequestBody Map
map){ - return deliverFileService.findFileById(request,map);
- }
大家肯定會(huì)說,這么簡單的事情你都不會(huì),阿粉你干啥吃的,一個(gè)查詢文件都有問題,而事實(shí)上,在代碼里面我的同事也沒有完全去處理這個(gè)空值的問題,結(jié)果導(dǎo)致一直都出在ajax里面出現(xiàn)“接口出錯(cuò),請重試”的錯(cuò)誤。
而問題就在于他沒有處理空的數(shù)據(jù),而直接就返給我了,這種問題也是非常的奇怪,很多時(shí)候不都是應(yīng)該處理一下空的數(shù)據(jù)為防止NULL的異常么?而阿粉也第一時(shí)間找到了他,他說沒問題,在他那里正常調(diào)用,我當(dāng)時(shí)就尷尬了,我給你傳遞的參數(shù)是沒問題的,查詢數(shù)據(jù)如果為空,應(yīng)該會(huì)有提示的才對。于是阿粉只能是簡單的修改了一下他的代碼,變成了
- @PostMapping("findFileById")
- @ResponseBody
- public 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è)空對象就好了,如果不是的話,就把查詢回來的數(shù)據(jù)完整的返還給我。
那么阿粉現(xiàn)在就來說說這個(gè)如何處理我們的空值的問題,不然以后你如果寫好的數(shù)據(jù)接口,給別人調(diào)用,調(diào)用出來如果是個(gè)空的字符串也就罷了,但如果像是null這種不處理的東西,那么一定會(huì)被別人鄙視死。
如何處理空指針異常的問題
什么時(shí)候出現(xiàn)NullPointerException?
我們都知道 NullPointerException 是繼承 RuntimeException 的,也就是運(yùn)行的時(shí)候會(huì)出的異常信息,當(dāng)我們寫代碼的時(shí)候,如果代碼在運(yùn)行的時(shí)候,我們使用的對象沒有初始化的時(shí)候,或者是為空的時(shí)候,就會(huì)出現(xiàn)空指針的異常,而這個(gè)異常也是我們感覺最 Low 的,最不可能出現(xiàn)的異常,但是往往因?yàn)樽约旱牟蛔⒁猓统霈F(xiàn)了。
其實(shí)這個(gè)辦法可就太多了,而很多時(shí)候我們也是不去注意這個(gè)事情的,就比如說對象,判空操作,但是你如果在每個(gè)對象使用的時(shí)候都判空,那么你的代碼真的就會(huì)出現(xiàn):
- if(a!=null){
- if(b!=null){
- if(c!=null){
- ....
- }
- }
- }
當(dāng)你看到這種代碼的時(shí)候,第一感覺有沒有直接想把這個(gè)朋友拉過來捶一頓,這種要是寫多了,人都快瘋了,尤其是二次維護(hù)的人員。
其實(shí)這種方法雖然笨,但是也算是一個(gè)習(xí)慣,判空,對功能上來說,肯定是不會(huì)出現(xiàn)很多麻煩,但是這么個(gè)空值也是很折磨人的,那么我們就來處理一下他吧。
1.這個(gè)我們就不說了直接判斷對象是不是為空就行了。
第二個(gè),就是比對equals方法的時(shí)候,我們很多時(shí)候的寫作習(xí)慣就是這種
- if(text.equals("xxxxx")){
- }
其實(shí)這么比對沒有問題,但是你有沒有想過,如果說你的text是個(gè)空呢?你比對的時(shí)候不就出錯(cuò)了?而曾經(jīng)也有一個(gè)面試官問我,為什么在筆試題里面去把已知的字符串寫在前面,當(dāng)時(shí)可能只是一種習(xí)慣,而后來卻發(fā)現(xiàn)這是真的有用滴。
你改成:
- if("xxxxx".equals(text)){
- }
就會(huì)避免了出現(xiàn)空指針的錯(cuò)誤了,多好的習(xí)慣不是么?
第三個(gè),也是我們在Java8里面提供的特性O(shè)ptional
ofNullable,就是Optional中提供的,將我們需要的參數(shù)傳遞過去,就可以判斷是否為空了。
而對于集合來說,大家就可以使用之前修改的那個(gè)方法,判斷是否為null,如果是null,那么我們一定要返回一個(gè)哪怕是空對象,或者是一個(gè)空的集合,這樣對于之后調(diào)用你接口的人來說,也是非常友善的。
我知道很多人會(huì)說,那我在接口上面寫上個(gè)注釋,查詢返回的值會(huì)有可能是個(gè)空,大家小心調(diào)用,雖然你提示了問題,但是你這是沒有解決問題的體現(xiàn)呀,就相當(dāng)于,你把所有的異常全部都拋出去了,而沒有去處理他。
我們這時(shí)候還可以使用 Java8 里面提供的 Optional ,比如這個(gè)樣子
- Optional
getProductOptional(String id)
這個(gè)時(shí)候,當(dāng)我們的調(diào)用者知道有 Optional 的存在的時(shí)候,自然而然的明白了。
關(guān)于處理null,你還有其他的好的方式么?
網(wǎng)站題目:被同事的空指針硬生生的折磨了好久,終于學(xué)會(huì)了如何處理空指針
網(wǎng)頁鏈接:http://m.fisionsoft.com.cn/article/cdhshgs.html


咨詢
建站咨詢
