ホームページ >Java >&#&チュートリアル >Java で NullPointerException を回避する方法

Java で NullPointerException を回避する方法

黄舟
黄舟オリジナル
2017-09-07 10:31:111696ブラウズ

この記事はJavaでNullPointerException(nullポインタ)を回避する方法のまとめに関する関連情報を中心に紹介していますので、必要な方は参考にしてください

javaでNullPointerException(nullポインタ)を回避する方法のまとめ

を投げ込みます。 Java アプリケーション NullPointerException は、null ポインターを処理する最良の方法であり、スムーズに動作する堅牢なプログラムを作成するための鍵となります。 「予防は治療よりも優れている」ということわざにあるように、この文は、このような迷惑な Null ポインタ例外にも当てはまります。ありがたいことに、防御的なコーディング手法を適用し、アプリケーションの複数の部分間の接続を追跡することで、Java での null ポインタ例外を適切なレベルに制御できます。ところで、これは Javarevisited に関する 2 番目の NullPointerException の投稿です。前回の投稿では、Java における null ポインター例外の一般的な原因について説明しました。このチュートリアルでは、Java プログラミングのヒントとベスト プラクティスを学びます。これらのヒントは、Java での null ポインター例外を回避するのに役立ちます。これらのヒントに従うと、Java コード全体に存在する非 null チェックの数も減らすことができます。経験豊富な Java プログラマであれば、おそらくこれらのテクニックのいくつかをすでに知っており、プロジェクトに適用しているでしょう。しかし、初心者および中級の開発者にとっては、学ぶ価値は十分にあります。ちなみに、null ポインタ例外を回避し、null ポインタのチェックを減らすための他の Java テクニックをご存知の場合は、ぜひ共有してください。

これらは簡単に適用できるシンプルなヒントですが、コードの品質と堅牢性に大きな影響を与えます。私の経験では、最初のヒントだけがコードの品質を大幅に向上させます。前に述べたように、null ポインター例外を回避し、null ポインターのチェックを減らすための Java のテクニックをご存知の場合は、この記事にコメントして共有していただけます。

1) 未知のオブジェクトではなく、既知の String オブジェクトから、equals() メソッドとqualsIgnoreCase() メソッドを呼び出します。

常に既知の null 以外の String オブジェクトから equals() メソッドを呼び出します。 equals() メソッドは対称であるため、a.equals(b) の呼び出しと b.equals(a) の呼び出しはまったく同じです。そのため、プログラマはオブジェクト a と b について非常に不注意になります。呼び出し元が null ポインターの場合、この呼び出しによって Null ポインター例外が発生する可能性があります


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}

これは、Null ポインター例外を回避するための最も簡単な Java トリックですが、equals() は一般的なメソッドであるため、大幅な改善につながる可能性があります。

2) valueOf() と toString() が同じ結果を返す場合は、前者を使用することを優先します。

null オブジェクトの toString() を呼び出すと null ポインター例外がスローされるため、valueOf() を使用して同じ値を取得できる場合は、valueOf() に null を渡すと返されます。 null" 、特に Integer、Float、Double、BigDecimal などのラッパー クラスで。


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"

3) null セーフなメソッドとライブラリを使用する null ポインタ チェックという面倒な作業をすでに行っているオープン ソース ライブラリが多数あります。 最も一般的に使用されるものの 1 つは、Apache Commons の StringUtils です。 StringUtils.isBlank()、isNumeric()、isWhiteSpace()、およびその他のユーティリティ メソッドは、null ポインター例外を気にせずに使用できます。


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false

ただし、結論を下す前に、null ポインター メソッドのクラスのドキュメントを読むことを忘れないでください。これも、多くの労力をかけずに大幅に改善できる Java のベスト プラクティスです。

4) メソッドから null ポインターを返さないようにし、代わりに空のコレクションまたは空の配列を返します。

この Java のベスト プラクティスまたはトリックは、Joshua Bloch の著書『Effective Java』で言及されています。これは、Java でのプログラミングを上達させるためのもう 1 つのヒントです。空のコレクションまたは配列を返すことで、size() や length() などの呼び出しが Null ポインター例外によってクラッシュしないようにすることができます。 Collections クラスは、便利な空のリスト、セット、およびマップ (Collections.EMPTY_LIST、Collections.EMPTY_SET、Collections.EMPTY_MAP) を提供します。以下に例を示します。


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}

null ポインターの代わりに Collections.EMPTY_SET および Collections.EMPTY_MAP を使用することもできます。

5) annotation@NotNullと@Nullable

を使用すると、プログラムを書くときにnullポインタにできるかどうかを定義できます。 @NotNull や @Nullable などのアノテーションを使用して、メソッドが null ポインター セーフであるかどうかを宣言します。最新のコンパイラ、IDE、またはツールは、この注釈を読み取って、忘れていた null ポインタ チェックを追加したり、不要な null ポインタ チェックを要求したりすることができます。 IntelliJ と findbugs はすでにこれらのアノテーションをサポートしています。これらのアノテーションも JSR 305 の一部ですが、IDE やツールにない場合でも、アノテーション自体をドキュメントとして使用できます。 @NotNull と @Nullable を見て、プログラマは null ポインタ チェックを行うかどうかを決定できます。ちなみに、この手法は Java プログラマにとって比較的新しいものであり、採用するにはしばらく時間がかかるでしょう。

6) コード内での不必要な自動ラッピングと自動解凍を避けてください。

一時オブジェクトの作成などの他の欠点に関係なく、ラッパー クラス オブジェクトが null の場合、自動ラッピングによって簡単に null ポインタ例外が発生する可能性があります。たとえば、person オブジェクトに電話番号がない場合、null が返され、次のコードは null ポインター例外によりクラッシュします。


Person ram = new Person("ram");
int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,6d267e5fab17ea8bc578f9e7e5e1570b 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

以上がJava で NullPointerException を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。