Java中如何處理空指標異常
NullPointerException 是Java 程式碼中最常見的例外,我將其最可能出現的場景歸為以下5 種:
參數值是Integer 等包裝類型,使用時因為自動拆箱出現了空白指標例外;
字串比較出現空指標例外;
- ##諸如ConcurrentHashMap 這樣的容器不支援Key 和Value 為null,強行put null 的Key 或Value 會出現空指標異常;
- A 物件包含了B,在透過A 物件的欄位取得B 之後,沒有對欄位判空就級聯呼叫B 的方法出現空指標異常;方法或遠端服務回傳的List 不是空而是null,沒有進行判空就直接呼叫List 的方法出現空指標異常。
private List<String> wrongMethod(FooService fooService, Integer i, String s, String t) { log.info("result {} {} {} {}", i + 1, s.equals("OK"), s.equals(t), new ConcurrentHashMap<String, String>().put(null, null)); if (fooService.getBarService().bar().equals("OK")) log.info("OK"); return null; } @GetMapping("wrong") public int wrong(@RequestParam(value = "test", defaultValue = "1111") String test) { return wrongMethod(test.charAt(0) == '1' ? null : new FooService(), test.charAt(1) == '1' ? null : 1, test.charAt(2) == '1' ? null : "OK", test.charAt(3) == '1' ? null : "OK").size(); } class FooService { @Getter private BarService barService; } class BarService { String bar() { return "OK"; } }
- #對於Integer 的判空,可以使用Optional.ofNullable 來建構一個Optional,然後使用orElse(0 ) 把null 替換為預設值再進行1 操作。對於String 和字面量的比較,可以把字面量放在前面,例如"OK".equals(s),這樣即使s 是null 也不會出現空指標異常;而對於兩個可能為null 的字串變數的equals 比較,可以使用Objects.equals,它會做判空處理。
- 對於 ConcurrentHashMap,既然其 Key 和 Value 不支援 null,修復方式就是不要把 null 存進去。 HashMap 的 Key 和 Value 可以存入 null,而 ConcurrentHashMap 看似是 HashMap 的線程安全版本,卻不支援 null 值的 Key 和 Value,這是容易產生誤解的地方。
- 對於類似fooService.getBarService().bar().equals(“OK”) 的級聯調用,需要判空的地方有很多,包括fooService、getBarService() 方法的回傳值,以及bar 方法傳回的字串。如果使用 if-else 來判空的話可能需要好幾行程式碼,但使用 Optional 的話一行程式碼就夠了。
- 對於rightMethod 傳回的List,由於無法確認其是否為null,所以在呼叫size 方法獲得清單大小之前,同樣可以使用Optional.ofNullable 包裝一下傳回值,然後透過. orElse(Collections.emptyList()) 實作在List 為null 的時候得到一個空的List,最後再呼叫size 方法。
private List<String> rightMethod(FooService fooService, Integer i, String s, String t) { log.info("result {} {} {} {}", Optional.ofNullable(i).orElse(0) + 1, "OK".equals(s), Objects.equals(s, t), new HashMap<String, String>().put(null, null)); Optional.ofNullable(fooService) .map(FooService::getBarService) .filter(barService -> "OK".equals(barService.bar())) .ifPresent(result -> log.info("OK")); return new ArrayList<>(); } @GetMapping("right") public int right(@RequestParam(value = "test", defaultValue = "1111") String test) { return Optional.ofNullable(rightMethod(test.charAt(0) == '1' ? null : new FooService(), test.charAt(1) == '1' ? null : 1, test.charAt(2) == '1' ? null : "OK", test.charAt(3) == '1' ? null : "OK")) .orElse(Collections.emptyList()).size(); }
- 我們根據業務需求分別對姓名、年齡和暱稱進行更新:對於姓名,我們認為客戶端傳null 是希望把姓名重設為空,允許這樣的操作,使用Optional 的orElse 方法一鍵把空轉換為空字串即可。
- 對於年齡,我們認為如果客戶端希望更新年齡就必須傳一個有效的年齡,年齡不存在重置操作,可以使用Optional 的orElseThrow 方法在值為空的時候拋出IllegalArgumentException。
- 對於暱稱,因為資料庫中姓名不可能為 null,所以可以放心地把暱稱設為 guest 加上資料庫取出的姓名。
@PostMapping("right") public UserEntity right(@RequestBody UserDto user) { if (user == null || user.getId() == null) throw new IllegalArgumentException("用户Id不能为空"); UserEntity userEntity = userEntityRepository.findById(user.getId()) .orElseThrow(() -> new IllegalArgumentException("用户不存在")); if (user.getName() != null) { userEntity.setName(user.getName().orElse("")); } userEntity.setNickname("guest" + userEntity.getName()); if (user.getAge() != null) { userEntity.setAge(user.getAge().orElseThrow(() -> new IllegalArgumentException("年龄不能为空"))); } return userEntityRepository.save(userEntity); }
以上是Java中如何處理空指標異常的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4
