Javaでnullポインタ例外を回避する方法

高洛峰
リリース: 2017-01-18 14:42:31
オリジナル
1687 人が閲覧しました

NullPointerException が好きな人はいません!それらを回避する方法はありますか?多分。 。

この記事では次のテクノロジーについて説明します

1. オプションの型 (Java 8 で新しく導入されました)
2. オブジェクト クラス (Java 7 でのオリジナル)

Java 8 のオプション クラス

とは何ですか?

1. Java 8 で新しく導入された型
2. 指定された型のオブジェクト、またはオブジェクト (null) が存在しないシナリオのラッパーとして使用されます

簡単に言えば、より良い代替手段 (警告: 一見するとそれほど明白ではないかもしれません)

基本的な使用法

これは型 (クラス) です - では、この型のインスタンスを作成するにはどうすればよいでしょうか?

3 つの静的メソッドを使用するとうまくいきます:

public static Optional<String> stringOptional(String input) {
    return Optional.of(input);
}
ログイン後にコピー

シンプルで簡単 - この値を含むオプションのラッパーを作成します。覚えておいてください - この値が 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();
}
ログイン後にコピー

本当に "null" 値を返したい場合。 「空」の値は null を意味しません。

それでは、オプションを消費/使用するにはどうすればよいですか?

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 メソッドを呼び出すという明らかに冗長な方法を回避できます。

えー

これについては少し混乱しています。同じ目的に対して 2 つの異なる方法があるのはなぜですか? orElse と orElseGet は明らかにオーバーロードできます (名前は同じですがパラメーターが異なります)。

いずれにせよ、これら 2 つのメソッドの明らかな違いはパラメータにあります。これ (関数型インターフェイス) を完了するには、Supplier のインスタンスの代わりにラムダ式を使用することを選択できます

なぜ一般的な null Check Strong ではなく Optional を使用するのでしょうか?

1. Optional を使用する最大の利点は、意図をより明確に表現できることです。null 値を返すと、(NPE が発生した場合に) これが意図的に返されたかどうかを消費者が混乱させるため、Javadoc を確認して詳細を確認する必要があります。 。 Optional の使用は非常に簡単です。

2. Optional を使用すると、NPE を完全に回避できます。前述したように、Optional.ofNullable、orElse および orElseGet を使用すると、NPE を回避できます。

もう一人の救世主!

このコード スニペットを見てください

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";
}
 
));
}
ログイン後にコピー

どれが空ですか?

1.マップオブジェクト
2.検索に使用されるキー
3.メソッド呼び出しのこのインスタンス

NPEがスローされた場合、どれがnullであるかをどのように判断できますか?

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");
}
}
ログイン後にコピー

requireNonNull メソッド

1. オブジェクトが null でない場合、それ自体を返します
2. 値が null の場合、返される NPE には指定されたメッセージが含まれます

if(myObj!=null) よりも優れている理由?

表示されるスタック トレース情報には、Objects.requireNonNull のメソッド呼び出しが明確に表示されます。これを独自のエラー ログと組み合わせることで、問題をより迅速に特定できるようになります。 。 。少なくとも私の意見ではその方が速いと思います。

独自のバリデーターをカスタマイズすることもできます。たとえば、Null 値がないことを確認する単純なバリデーターを実装します。

rreee

NPE を間違った場所で苦痛にしないでください。私たちは、NPE に適切に対処し、完全に根絶するためのツールを多数持っています。

Java での null ポインター例外を回避する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート