亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中避免空指針異常的方法

2019-11-26 15:24:08
字體:
來源:轉載
供稿:網友

沒人會喜歡空指針異常!有什么方法可以避免它們嗎?或許吧。。

本文將討論到以下幾種技術

1.Optional類型(Java 8中新引入的)
2.Objects類(Java 7中原有的)

Java 8中的Optional類

它是什么?

1.Java 8中新引入的類型
2.它是作為某個指定類型的對象的包裝器或者用于那些不存在對象(null)的場景

簡單來說,它是處理空值的一個更好的替代品(警告:乍一看可能并沒有那么明顯)

基本用法

它是一種類型(一個類)――那么,怎么才能創建一個這個類型的實例?

使用下它的三個靜態方法就可以了:

復制代碼 代碼如下:

public static Optional<String> stringOptional(String input) {
    return Optional.of(input);
}

簡單明了――創建一個包含這個值的Optional包裝器。記住――如果這個值是null的話,它會拋出NPE!

復制代碼 代碼如下:

public static Optional<String> stringNullableOptional(String input) {
if (!new Random().nextBoolean()) {
input = null;
}
return Optional.ofNullable(input);
}

我個人認為是要更好一點。這樣就不會有NPE的風險了――如果輸入為null的話,會返回一個空的Optional。

復制代碼 代碼如下:

public static Optional<String> emptyOptional() {
return Optional.empty();
}

如果你真的就是希望返回一個”空"值的話?!翱铡敝挡⒉灰馕吨鴑ull。

好吧,那如何去消費/使用Optional呢?

復制代碼 代碼如下:

public static void consumingOptional() {
Optional<String> wrapped = Optional.of("aString");
if (wrapped.isPresent()) {
System.out.println("Got string - " + wrapped.get());
}
else {
System.out.println("Gotcha !");
}
}

簡單的方法就是檢查Optional包裝器是否真的有值(使用isPresent方法)――你會懷疑這和使用if(myObj != null)相比有什么好處。別擔心,這個我會解釋清楚的。

復制代碼 代碼如下:

public static void consumingNullableOptional() {
String input = null;
if (new Random().nextBoolean()) {
input = "iCanBeNull";
}
Optional<String> wrapped = Optional.ofNullable(input);
System.out.println(wrapped.orElse("default"));
}

你可以使用orElse方法,這樣萬一封裝的確實是一個null值的話可以用它來返回一個默認值――它的好處顯而易見。在提取出真實值的時候可以避免調用ifPresent方法這樣明顯多余的方式了。

復制代碼 代碼如下:

public static void consumingEmptyOptional() {
String input = null;
if (new Random().nextBoolean()) {
input = "iCanBeNull";
}
Optional<String> wrapped = Optional.ofNullable(input);
System.out.println(wrapped.orElseGet(
() -> {
return "defaultBySupplier";
}
 
));
}

這個我就有點搞不清楚了。為什么有兩個同樣目的的不同方法?orElse和orElseGet明明可以重載的(同名但不同參數)。

不論如何,這兩個方法明顯的區別就在于它們的參數――你可以選擇使用lambda表達式而不是Supplier的實例來完成這個(一個函數式接口)

為什么使用Optional要比常見的null檢查強?

1.使用Optional最大的好處就是可以更明白地表述你的意圖――返回null值的話會讓消費者感到疑惑(當真的出現NPE的時候)這是不是故意返回的,因此還得查看javadoc來進一步定位。而使用Optional就相當明了了。

2.有了Optional你就可以徹底避免NPE了――如上所提,使用Optional.ofNullable,orElse以及orElseGet可以讓我們遠離NPE。

另一個救星!

看下這個代碼片段

復制代碼 代碼如下:

package com.abhirockzz.wordpress.npesaviors;
 
import java.util.Map;
import java.util.Objects;
 
public class UsingObjects {
 
String getVal(Map<String, String> aMap, String key) {
return aMap.containsKey(key) ? aMap.get(key) : null;
}
 
public static void main(String[] args) {
UsingObjects obj = new UsingObjects();
obj.getVal(null, "dummy");
}
}

哪個可能會為空?

1.Map對象
2.進行搜索使用的key
3.方法調用的這個實例

如果拋出NPE的話,我們怎么能確定到底是哪個是null的?

復制代碼 代碼如下:

package com.abhirockzz.wordpress.npesaviors;
 
import java.util.Map;
import java.util.Objects;
 
public class UsingObjects {
String getValSafe(Map<String, String> aMap, String key) {
Map<String, String> safeMap = Objects.requireNonNull(aMap,
"Map is null");
String safeKey = Objects.requireNonNull(key, "Key is null");
 
return safeMap.containsKey(safeKey) ? safeMap.get(safeKey) : null;
}
 
public static void main(String[] args) {
UsingObjects obj = new UsingObjects();
obj.getValSafe(null, "dummy");
}
}

requireNonNull方法

1.如果對象不為null的話就返回它本身
2.如果值為null的話,返回的NPE會帶有指定的消息

為什么比if(myObj!=null)要好?

你所看到的棧跟蹤信息會很清楚地看見Objects.requireNonNull的方法調用。這個再配合你自己的錯誤日志,可以讓你更快地定位問題。。。至少在我看來是更快。

你還可以自己自義校驗器,比如說實現一個簡單的校驗器來確保沒有空值。

復制代碼 代碼如下:

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
 
public class RandomGist {
 
    public static <T> T requireNonEmpty(T object, Predicate<T> predicate, String msgToCaller){
        Objects.requireNonNull(object);
        Objects.requireNonNull(predicate);
        if (predicate.test(object)){
            throw new IllegalArgumentException(msgToCaller);
        }
        return object;
    }
 
    public static void main(String[] args) {
       
    //Usage 1: an empty string (intentional)
 
    String s = "";
    System.out.println(requireNonEmpty(Objects.requireNonNull(s), (s1) -> s1.isEmpty() , "My String is Empty!"));
 
    //Usage 2: an empty List (intentional)
    List list =  Collections.emptyList();
    System.out.println(requireNonEmpty(Objects.requireNonNull(list), (l) -> l.isEmpty(), "List is Empty!").size());
 
    //Usage 3: an empty User (intentional)
    User user = new User("");
    System.out.println(requireNonEmpty(Objects.requireNonNull(user), (u) -> u.getName().isEmpty(), "User is Empty!"));
}
 
    private static class User {
        private String name;
 
        public User(String name){
            this.name = name;
        }
 
        public String getName(){
            return name;
        }
    }
}

不要讓NPE在錯誤的地方成為痛苦。我們有許多工具能更好地處理NPE,甚至徹底地根除它們!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产91久久久久久| 亚洲电影免费观看高清| 亚洲美女自拍视频| 亚洲色图偷窥自拍| 欧美成人午夜激情| 国产欧美婷婷中文| 国产精品视频区| 国产性色av一区二区| 亚洲激情视频在线观看| 日韩中文字幕国产| 日韩免费观看网站| 国产精品精品一区二区三区午夜版| 久久国产精品久久久久久久久久| 色与欲影视天天看综合网| 97碰碰碰免费色视频| 欧美日韩性视频在线| 亚洲电影免费观看| 成人精品一区二区三区电影黑人| 久久久999精品| 久久久久久噜噜噜久久久精品| 爽爽爽爽爽爽爽成人免费观看| 亚洲男人天堂2024| 日韩欧美在线观看| 亚洲国产成人精品一区二区| 超碰日本道色综合久久综合| 亚洲精品久久视频| 欧美性极品少妇精品网站| 97精品在线视频| 日本欧美一二三区| 一区二区欧美激情| 美女999久久久精品视频| 亚洲欧美成人一区二区在线电影| 日产日韩在线亚洲欧美| 亚洲欧美在线播放| 久久久精品一区二区三区| 精品久久久久久久中文字幕| 欧美日本国产在线| 亚洲精品www久久久| 国产成人aa精品一区在线播放| 日韩精品在线视频观看| 中文字幕精品—区二区| 国产在线视频欧美| 伊人久久综合97精品| 日韩欧美国产视频| 91国产中文字幕| 国产日韩精品在线观看| 久操成人在线视频| 日韩亚洲国产中文字幕| 亚洲精品久久久久久久久久久久| 欧美午夜视频一区二区| 美女扒开尿口让男人操亚洲视频网站| 国a精品视频大全| 日韩高清欧美高清| 国产精品伦子伦免费视频| 国产日韩精品在线播放| 久久成人综合视频| 中文字幕日韩av| 国产欧美一区二区三区视频| 亚洲一区二区三区视频播放| 国产精品成熟老女人| 91国内在线视频| 国产99久久精品一区二区 夜夜躁日日躁| 国产亚洲精品久久久久久777| 美女久久久久久久| 日本精品免费一区二区三区| 中文字幕日韩精品在线观看| 自拍偷拍免费精品| 国产精品香蕉av| 韩国欧美亚洲国产| 久久人人爽亚洲精品天堂| 高清欧美性猛交xxxx黑人猛交| 91精品久久久久久久久不口人| 51色欧美片视频在线观看| 欧美激情在线观看视频| 欧美限制级电影在线观看| 色妞色视频一区二区三区四区| 国产精品福利网| 国产成人a亚洲精品| 国产精品美女呻吟| 亚洲欧美中文字幕在线一区| 日韩美女在线看| 美女国内精品自产拍在线播放| 国产精品久久久久久搜索| 亚洲欧美制服另类日韩| 日韩成人在线免费观看| 国产精品久久久久久久久久久不卡| 欧美激情在线视频二区| 日韩少妇与小伙激情| 亚洲一区二区三区四区在线播放| 国产精品流白浆视频| 日韩av有码在线| 8050国产精品久久久久久| 欧美激情图片区| 日韩欧美成人区| 国产99久久久欧美黑人| 国产日本欧美一区二区三区| 日韩中文在线视频| 性日韩欧美在线视频| 国外日韩电影在线观看| 91超碰caoporn97人人| 久久亚洲欧美日韩精品专区| 国产精品18久久久久久麻辣| 亚洲国产日韩欧美综合久久| 亚洲一区二区久久久久久| 亚洲一区二区三区sesese| 成人黄色激情网| 亚洲香蕉伊综合在人在线视看| 一本大道香蕉久在线播放29| 国产精品成人国产乱一区| 黑人巨大精品欧美一区二区一视频| 2019国产精品自在线拍国产不卡| 国内外成人免费激情在线视频网站| 欧美日韩激情美女| 国产suv精品一区二区三区88区| 日韩理论片久久| 精品久久久91| 亚洲人成在线观看网站高清| 国产精品成人aaaaa网站| 欧洲成人免费视频| 黄网动漫久久久| 亚洲性线免费观看视频成熟| 国产精品免费小视频| 少妇av一区二区三区| 国产va免费精品高清在线| 海角国产乱辈乱精品视频| 久久久在线免费观看| 成人免费看黄网站| 亚洲精品98久久久久久中文字幕| 欧美孕妇性xx| 久久久久久999| 精品国内自产拍在线观看| 欧美日韩日本国产| 日韩av成人在线| 亚洲精品欧美一区二区三区| 日韩av在线免费| 国产成人一区二区三区| 美女撒尿一区二区三区| 亚洲日本欧美日韩高观看| 久久激情视频免费观看| 亚洲色图13p| 欧美日韩午夜视频在线观看| 中文字幕无线精品亚洲乱码一区| 久久久久久亚洲精品不卡| 在线丨暗呦小u女国产精品| 欧洲亚洲免费在线| 亚洲影院高清在线| 中文字幕日韩在线视频| 成人有码在线视频| 国产精品国产三级国产aⅴ浪潮| 久久99久国产精品黄毛片入口| 国产精品a久久久久久| 91免费视频国产| 亚洲天堂男人天堂| 久久久精品2019中文字幕神马| 欧美激情网友自拍| 国产在线高清精品| 日本精品久久电影| 91精品免费久久久久久久久| 国产精品v日韩精品| 欧美视频免费在线观看| 亚洲福利在线播放| 精品激情国产视频| 日韩欧美第一页| 欧美孕妇性xx|