ホームページ  >  記事  >  Java  >  Java 文字列と Null の連結で NullPointerException がスローされないのはなぜですか?

Java 文字列と Null の連結で NullPointerException がスローされないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 06:59:08308ブラウズ

Why Does Java String Concatenation with Null Not Throw a NullPointerException?

Null 文字列連結の謎

Java では、' ' 演算子を使用した文字列の連結が一般的な操作です。ただし、文字列の 1 つが null の場合、予期しない動作が発生するため、さらなる調査が必要です。

矛盾する期待

従来の通念では、null 文字列を連結すると結果が生じるはずであると考えられます。 NullPointerException で。結局のところ、Java では null は例外値として扱われることがよくあります。ただし、この場合、結果は例外ではなく、「null」を含む文字列になります。

次の例を考えてみましょう。

String s = null;
s = s + "hello";
System.out.println(s); // prints "nullhello"

このコードは、 NullPointerException、期待を裏切る。

メカニズムの解明

これが発生する理由を理解するには、Java 言語仕様 (JLS) を詳しく調べる必要があります。 JLS によれば、文字列連結内の引数の 1 つが null の場合、連結を実行する前に自動的に文字列 "null" に変換されます。

実装の詳細

この謎をさらに解明するために、上記のコードに対してコンパイラーによって生成されたバイトコードを調べることができます。コンパイラは、実際にコードを以下と同等のものに変換します。

String s = null;
s = new StringBuilder(String.valueOf(s)).append("hello").toString();
System.out.println(s); // prints "nullhello"

StringBuilder クラスは null 値を適切に処理し、例外なく連結が成功するようにします。

コンパイラの最適化

JLS では、コンパイラーがパフォーマンスのために文字列連結を最適化できるように明示的に許可していることに注意してください。この例では、コンパイラは StringBuffer を直接作成し、中間の String.valueOf() 呼び出しを回避するなど、より効率的なアプローチを使用することもできました。 🎜>この動作は、Java プログラマにとっていくつかの影響を及ぼします。

Null 文字列の連結は例外をスローしない有効な操作です。

結果の文字列には常に文字列「null」が含まれます。オペランドの 1 つが null の場合。

プログラマはこの動作を認識し、コード内で適切に使用する必要があります。

以上がJava 文字列と Null の連結で NullPointerException がスローされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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