Javaでnullポインタ例外を解決および防止する方法は何ですか?

1 はじめに

Java 開発の過程で、よくある厄介な問題として、ヌルポインタ例外 (NullPointerException) があります。Null ポインター例外は、プログラムで最も一般的なエラーの 1 つであり、プログラムのクラッシュや操作の失敗など、一連の問題を引き起こす可能性があります。この記事ではJavaでヌルポインタ例外を解決する方法を詳しく紹介します。

2.ヌルポインタ例外の原因

通常、値が null であるオブジェクトのメソッドまたはプロパティを呼び出すと、null ポインター例外が発生します。たとえば、次のコードでは:

String str = null;
int length = str.length();

str オブジェクトの値は null であるため、その length メソッドが呼び出されると null ポインター例外がスローされます。

3.ヌルポインタ例外を防ぐ方法

3.1 オブジェクトが null かどうかを確認する

null ポインター例外を回避する最も基本的な方法は、オブジェクトを使用する前に null チェックを実行することです。たとえば、String オブジェクトを使用する前に、次のように null かどうかを確認できます。

String str = null;
if(str != null) {
    
    
    int length = str.length();
}

このように、オブジェクトが null の場合、そのメソッドは呼び出されません。

同様に、メソッドを呼び出すときに、最初にメソッド パラメータに対して null チェックを実行することもできます。たとえば、次のメソッドは String オブジェクトをパラメーターとして受け取ります。

public void process(String str) {
    
    
    if(str != null) {
    
    
        // 进行处理
    } else {
    
    
        // 抛出异常或返回错误信息
    }
}

3.2 Optional クラスの使用

オプションは、Java 8 で追加された新機能です。これは、任意の型をラップできるコンテナー オブジェクトです。Optional オブジェクトには、null が含まれる場合もあれば、空である場合もそうでない場合もある値を表す、null 以外の値の型が含まれる場合もあります。NullPointerException を回避するために使用します。

3.2.1 オプションオブジェクトの作成

Optional.of()、Optional.empty()、および Optional.ofNullable() メソッドを使用して、Optional オブジェクトを作成できます。これらのメソッドの主な違いは、null 値の処理方法です。

Optional.of() メソッドを使用して Optional オブジェクトを作成する場合、受信パラメーターが null の場合、NullPointerException がスローされます。例:

String str = null;
Optional<String> optionalStr = Optional.of(str); //抛出NullPointerException异常

Optional.empty() メソッドを使用して、空の Optional オブジェクトを作成します。例:

Optional<String> optionalStr = Optional.empty(); //创建空的Optional对象

Use the Optional.ofNullable() method to create an Optional object. 受信パラメーターが null の場合、空の Optional オブジェクトが作成されます。例:

String str = null;
Optional<String> optionalStr = Optional.ofNullable(str); //创建空的Optional对象

3.2.2 Optional オブジェクトの使用

isPresent() メソッドを使用して、Optional オブジェクトに null 以外の値が含まれているかどうかを判断します。含まれている場合は true、含まれていない場合は false を返します。例えば:

String str = "hello";
Optional<String> optionalStr = Optional.of(str);

if(optionalStr.isPresent()) {
    
    
    System.out.println(optionalStr.get()); //输出hello
}

Optional オブジェクトの値を取得するには、orElse() メソッドを使用します。Optional オブジェクトに空でない値が含まれている場合は、この値を直接返します。そうでない場合は、渡されたデフォルト値を返します。例:

String str = null;
Optional<String> optionalStr = Optional.ofNullable(str);

String result = optionalStr.orElse("world");
System.out.println(result); //输出world

Use the orElseGet() method to get the value in the Optional object. Optional オブジェクトに空でない値が含まれている場合は、この値を直接返し、そうでない場合は、Lambda 式によって生成されたデフォルト値を返します。orElse() メソッドとは異なり、orElseGet() メソッドのデフォルト値は Lambda 式によって生成されます。例えば:

String str = null;
Optional<String> optionalStr = Optional.ofNullable(str);

String result = optionalStr.orElseGet(() -> "world");
System.out.println(result); //输出world

Use the orElseThrow() method to get the value in the Optional object. Optional オブジェクトに null 以外の値が含まれている場合は、この値を直接返し、そうでない場合は、Lambda 式によって生成された例外を返します。例:

String str = null;
Optional<String> optionalStr = Optional.ofNullable(str);
String result = optionalStr.orElseThrow(() -> new RuntimeException("value not found"));

Optional オブジェクトに null 以外の値が含まれている場合は、ifPresent() メソッドを使用して特定のアクションを実行します。例:

String str = "hello";
Optional<String> optionalStr = Optional.of(str);
optionalStr.ifPresent(System.out::println); //输出hello

Optional オブジェクトの値を取得するには、get() メソッドを使用します。Optional オブジェクトに null 以外の値が含まれている場合は、この値を直接返します。そうでない場合は、NoSuchElementException をスローします。例:

String str = "hello";
Optional<String> optionalStr = Optional.of(str);

String result = optionalStr.get();
System.out.println(result); //输出hello

3.3 Objects.requireNonNull メソッドの使用

Java 7 では、Objects クラスが null チェック用の requireNonNull メソッドを提供します。このメソッドの機能は、受信パラメーター値が null かどうかをチェックすることです。null の場合は、NullPointerException がスローされます。

たとえば、requireNonNull メソッドを使用した例を次に示します。

String str = null;
Objects.requireNonNull(str, "参数值不能为null");
int length = str.length();

上記のコードでは、str が null の場合、指定されたエラー メッセージとともに NullPointerException がスローされます。もちろん、エラーメッセージを指定しないことも可能です。

4.ヌルポインタ例外の解決方法

4.1 if ステートメントの使用

コードでは、if ステートメントを使用して null 値を決定することは、NullPointerException を回避する効果的な方法です。以下のコードでは:

String str = null;
if (str != null) {
    
    
    // 对str进行某些操作
}

str が null の場合、if 条件が真でない場合、コードは実行を継続しないため、NullPointerException は発生しません。

4.2 try-catch ステートメントの使用

コードでは、try-catch ステートメントを使用して NullPointerException を処理することは、プログラムのクラッシュを回避するための緊急の方法です。以下のコードでは:

try {
    
    
    String str = null;
    int length = str.length();
} catch (NullPointerException e) {
    
    
    e.printStackTrace();
    // 进行异常处理
}

str が null の場合、NullPointerException がスローされます。この時点で、try ブロック内のコードの実行が停止し、プログラムの制御が catch ブロックに渡されます。catch ブロックでは、例外を処理できます。このようにして、プログラムのクラッシュを回避できます。

4.3 三項演算子の使用

コードでは、三項演算子を使用すると、NullPointerException を簡単に回避できます。以下のコードでは:

String str = null;
int length = (str == null) ? 0 : str.length();

str が null の場合、長さを 0 に割り当てます。それ以外の場合は、str.length() メソッドを呼び出します。

5. まとめ

Null ポインター例外は、プログラムで発生しやすい問題です. この問題を回避するには、コード内で null 値を使用しないようにする必要があります. null 値を使用する必要がある場合は、使用する前に null チェックを実行する必要があります。この記事では、オブジェクトが null かどうかのチェック、Optional クラスの使用、Objects.requireNonNull メソッドの使用、if ステートメントの使用、try-catch ステートメントの使用、三項演算子の使用など、null ポインター例外を防止および解決する方法について説明します。コードを記述するときは、実際の状況に応じて 1 つまたは複数の方法を選択して、コードのエラー トレランスと可読性を向上させることができます。

おすすめ

転載: blog.csdn.net/ly1347889755/article/details/130255056