すべてのRuntimeException
例外の中で、おそらく Java プログラマがNullPointerException
これらの。
NullPointerException
つまり、一般に NPE として知られるヌル ポインター例外です。オブジェクトが null の場合、そのメソッドを呼び出すか、そのフィールドにアクセスするとNullPointerException
、この例外が通常JVM
、次のようにスローされます。
// NullPointerException
public class Main {
public static void main(String[] args) {
String s = null;
System.out.println(s.toLowerCase());
}
}
ポインタの概念は実際には C 言語から来ており、Java 言語にはポインタはありません。私たちが定義する変数は実際には参照、Null Pointer
より正確には参照Null Reference
ですが、この 2 つに大きな違いはありません。
対処するNullPointerException
もしそうならNullPointerException
、どう対処すればよいでしょうか?まず第一に、NullPointerException
それがコード ロジック エラーであることを明確にする必要があります。発生した場合はNullPointerException
、早期に公開し、早期に修正することが原則です。このコーディング エラーを隠すために catch を使用することは固く禁じられています。
// 错误示例: 捕获NullPointerException
try {
transferMoney(from, to, amount);
} catch (NullPointerException e) {
}
適切なコーディングを実践するとNullPointerException
、たとえば次のようなものの生成を大幅に削減できます。
メンバー変数は定義時に初期化されます。
public class Person {
private String name = "";
}
デフォルトの null の代わりに空の文字列 "" を使用すると、多くのことを回避できますNullPointerException
。ビジネス ロジックを作成するときは、空の文字列 "" を使用して、値が入力されていないことを示す方が、null よりも安全です。
null の代わりに空の文字列 ""、つまり空の配列を返します。
public String[] readLinesFromFile(String file) {
if (getFileSize(file) == 0) {
// 返回空数组而不是null:
return new String[0];
}
...
}
これにより、呼び出し元は結果が null かどうかを確認する必要がなくなります。
ファイルが存在しないことを示すために null を返すなど、呼び出し元が null に基づいて判断する必要がある場合は、Optional を返すことを検討してください。
public Optional<String> readFromFile(String file) {
if (!fileExist(file)) {
return Optional.empty();
}
...
}
このように、呼び出し側はOptional.isPresent()
結果があるかどうかの判断を下す必要があります。
NullPointerException の検出
NullPointerException
たとえば、 abcx() を呼び出すときにこの問題が発生する場合NullPointerException
、その理由は次の可能性があります。
a は null;
ab は null;
abc は null;
どのオブジェクトが null であるかを判断する前に、次のようなログのみを出力できます。
System.out.println(a);
System.out.println(a.b);
System.out.println(a.b.c);
Java 14 以降、null オブジェクトが生成されるとNullPointerException
、JVM は null オブジェクトが誰であるかを示す詳細情報を提供できるようになります。例を見てみましょう:
public class Main {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.address.city.toLowerCase());
}
}
class Person {
String[] name = new String[2];
Address address = new Address();
}
class Address {
String city;
String street;
String zipcode;
}
NullPointerException
詳細情報に is null のようなものが表示されます。... because "<local1>.address.city"
これは、都市フィールドが null であることを意味するため、問題をすぐに特定できます。
この拡張機能の詳細情報NullPointerException
は Java 14 の新機能ですが、デフォルトではオフになっていますXX:+ShowCodeDetailsInExceptionMessages
。JVM に - パラメーターを追加して有効にできます。
java -XX:+ShowCodeDetailsInExceptionMessages Main.java
まとめ
NullPointerException
これは Java コードでよく見られるロジック エラーであり、早期に発見して修復する必要があります。
Java 14 の拡張例外情報を有効にして、NullPointerException
詳細なエラー情報を表示できます。