今日は、アプリケーションで NullPointerException を回避する簡単なテクニックを紹介します。従うのは簡単ですが、コードの信頼性と品質が大幅に向上します。さらに、私の経験では、最初のヒントはコードの品質に顕著な影響を与えます。他に Java プログラミングのコツをご存知の場合は、コメント欄でお気軽に共有してください。
のテストという大きな負担を引き受けるオープン ソース ライブラリが多数あります
これは、Joshua Bloch が著書『Java: 効果的なプログラミング』で説明しているもう 1 つの優れた Java プログラミングのヒントです。
未知のオブジェクトではなく既知の文字列リテラルに対して、equals() メソッドとqualsIgnoreCase() メソッドを呼び出します。
equals()
常に、そうではないことがわかっている既知の文字列に対してメソッドを呼び出しますnull
。このメソッドequals()
は対称的です。つまり、 と を呼び出すa.equals(b)
とb.equals(a)
同じ結果が得られます ( ifa
とb
not null
)。このため、多くのプログラマはequals()
、 ya
または y のどちらのオブジェクトが呼び出されるかに注意を払いませんb
。この副作用の 1 つは、メソッドが呼び出された場合に NullPointerException が発生することですnull
。
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
これは NullPointerException を回避するための最も簡単なヒントですが、このメソッドは遍在しているため、これだけでも大幅な改善になりますequals()
。
両方が同じ結果を生成する場合は、toString() ではなく valueOf() を選択してください
toString()
値を持つ参照を呼び出すと NullPointerException がスローされるため、 from から呼び出すとが返されるため、同じ結果が得られる場合はnull
呼び出しを使用することをお勧めします。これは、、、 などのラッパー クラスに特に当てはまります。 valueOf()
valueOf()
null
null
Integer
Float
Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
オブジェクトが存在できるかどうかわからない場合は、次のヒントを使用してくださいnull
。
null
-safe メソッドとライブラリを使用する
のテストという大きな負担を引き受けるオープン ソース ライブラリが多数ありますnull
。最も一般的なものの 1 つは、StringUtils
Apache Commons からのものです。StringUtils.isBlank()
、などのメソッドを使用しますisNumeric()
。isWhiteSpace()
NullPointerException のスローについて心配する必要はありません。
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
出力: true true false false ただし、使用する前に、null
安全なメソッドとクラスのドキュメントを読むことを忘れないでください。これも、多くの労力を必要とせずに大幅な改善につながる Java の優れたトリックの 1 つです。
null
メソッドから返さないようにしてください。空のコレクションを返すことをお勧めします。
これは、Joshua Bloch が著書『Java: 効果的なプログラミング』で説明しているもう 1 つの優れた Java プログラミングのヒントです。size()
空のコレクションまたは配列を返すときは、や などの基本メソッドを呼び出してもlength()
NullPointerException がスローされないようにしてください。このクラスは、Collections
空のリスト、セット、辞書の便利な実装を具体的に宣言しますCollections.EMPTY_LIST
:Collections.EMPTY_SET
およびCollections.EMPTY_MAP
。例えば:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
同様に、を返す代わりにCollections.EMPTY_SET
それを使用することもできます。 Collections.EMPTY_MAP
null
@NotNull および @Nullable アノテーションを使用する
メソッドの説明では、null
アノテーションと @Nullable を使用してメソッドの安全性規則を定義し@NotNull
、メソッドが返せるnull
かどうかを示すことができます。最新のコンパイラと IDE は、これらのアノテーションを使用してコードを分析し、たとえば のチェックの欠落について、null
またはその逆、コードを詰まらせている不要なチェックを削除する可能性についてなど、適切なアドバイスを提供できます。たとえば、このような注釈は IntelliJ IDE と FindBugs でサポートされており、JSR 305 にも含まれています。ただし、IDE がそのような注釈をサポートしていない場合でも、それ自体が優れたドキュメントになります。これを見る@NotNull
と、@Nullable
プログラマはどこにチェックを追加し、どこにチェックを追加しないかを理解しやすくなりますnull
。ちなみに、これは Java プログラマの間ではかなり新しい習慣であり、普及するには時間がかかるでしょう。
コード内で不必要な自動ボックス化と自動ボックス化解除を回避する
これにより、不要な一時オブジェクトが作成されるだけでなく、ラッパー クラスが の場合、オートボクシングによって NullPointerException がスローされる可能性もありますnull
。たとえば、次のコードは、個人エントリに電話番号が含まれていない場合に NullPointerException をスローし、 を返しますnull
。
Person ram = new Person("ram");
int phone = ram.getPhone();
自動ボックス化または自動ボックス化解除を使用する場合、等式だけでなく不等式も<
NullPointerException>
を引き起こす可能性があります。
規則に従い、適切なデフォルトを定義します。
Java で NullPointerException を回避する最善の方法の 1 つは、コーディング規約を適切に宣言して従うことです。ほとんどの NullPointerException は、必要なデータと依存関係がすべて揃っていない状態でオブジェクトを作成しようとしたときに発生します。このようなリクエストを適切に拒否して未完成のオブジェクトの作成を防ぐことで、将来的に大量の NullPointerException が発生するのを防ぐことができます。同様に、オブジェクトの作成を許可する場合は、適切なデフォルト値を選択する必要があります。たとえば、クラス オブジェクトはEmployee
名前と がなければ作成できませんid
が、電話番号は持たない可能性があります。この場合、Employee
数値のないオブジェクトは代わりにゼロを返すことがありますnull
。オブジェクトのこのような動作は事前に考慮する必要がありますが、null
存在しない番号に電話するよりも確認する方が簡単な場合があります。この場合、どのフィールドが有効でnull
どのフィールドが無効であるかについて追加の条件を設定すると、正しい決定を下すのに役立ちます。一般に、プログラムをすぐにクラッシュさせるか、プログラムnull
を割り当てるかの選択は重要な設計上の決定であり、一度選択したら、一貫してそれに従う必要があります。
DBMSレベルで制限を設定する
データベースを使用して顧客や注文などのプログラム オブジェクトを保存する場合、null
適切なテーブル制限を使用して DBMS レベルでオブジェクトの「らしさ」を指定することが賢明です。データベースには複数のソースからの情報が含まれることが多く、欠損値のチェックを導入するとデータの整合性が向上します。さらに、DBMS レベルでの null チェックの存在により、Java コードでのチェックが削減されます。データベースから Java オブジェクトにデータをロードすることで、null チェックの存在を確認し、!= null
プログラム コードから不要な " " を削除できます。
Null オブジェクト パターンを使用する
特別なNull
-objects を作成することは、Java で NullPointerExcpetion を回避するもう 1 つの方法です。アプリケーション内のメソッドがオブジェクトを返し、その後プログラムがそのメソッドを呼び出すことでそのオブジェクトを操作すると仮定します。たとえば、このメソッドは、コレクションを反復処理するために使用されるCollection.iterator()
クラスのオブジェクトを返します。Iterator
元のオブジェクトにイテレータがない場合は、代わりに常に を返すメソッドを持つnull
特別な -object を返すことができます。読者の皆さん、Java プログラムから NullPointerException エラーを取り除くためのヒントはこれで終わりです。これらのシンプルで面倒ではないルールがいかに便利であるかがわかるでしょう。Java プログラムでの他の NullPointerException トリックを共有したい場合は、コメントで自由に共有してください。 JavaRush の学生向けに特別に翻訳されました。オリジナルNull
hasNext()
false
GO TO FULL VERSION