[解決済み] JavaでNULL文字列を連結する【重複】について
質問
なぜ以下のようになるのでしょうか? 私が期待するのは
NullPointerException
をスローします。
String s = null;
s = s + "hello";
System.out.println(s); // prints "nullhello"
解決方法は?
なぜ をしなければならない。 動作するのか?
は <ストライク JLS 5, 15.18.1.1項 JLS 8 §15.18.1 "文字列の連結演算子 +" につながる。 JLS 8, §5.1.11 "文字列の変換" は、この操作が失敗せずに成功することが必要です。
...あとは参照値のみを考慮すればよい。 参照がNULLの場合、文字列 "null"に変換されます。 (4つのASCII文字n, u, l, l)です。それ以外の場合は、あたかも参照されたオブジェクトのtoStringメソッドを引数なしで呼び出したかのように変換されます。ただし、toStringメソッドを呼び出した結果がNULLだった場合は、代わりに文字列 "null"が使用されます。
どのように は、どのように機能するのでしょうか?
バイトコードを見てみよう! コンパイラはあなたのコードを
String s = null;
s = s + "hello";
System.out.println(s); // prints "nullhello"
で、代わりにこう書いたかのようにバイトコードにコンパイルします。
String s = null;
s = new StringBuilder(String.valueOf(s)).append("hello").toString();
System.out.println(s); // prints "nullhello"
(自分で
javap -c
)
の append メソッド。
StringBuilder
はすべてnullをうまく処理します。 この場合
null
が第一引数です。
String.valueOf()
が代わりに呼び出される。StringBuilder には任意の参照型を受け取るコンストラクタがないからである。
もし仮に
s = "hello" + s
の代わりに、同等のコードは次のようになります。
s = new StringBuilder("hello").append(s).toString();
ここで、この場合、appendメソッドはnullと
その後
に委ねる。
String.valueOf()
.
注 文字列の連結は、どの最適化を行うかをコンパイラが決定できる稀な場所の1つです。そのため、正確な等価値はコンパイラによって異なる可能性があります。この最適化は JLS 15.18.1.2項 :
Javaコンパイラは、文字列の連結を繰り返す際のパフォーマンスを上げるために、StringBufferクラスや同様の手法を用いて、式の評価によって生成される中間Stringオブジェクトの数を減らすことがあります。
上記の "等価コード" を決定するために使用したコンパイラは、Eclipse のコンパイラです。 ecj .
関連
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptで複数行の文字列を作成する
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] goで文字列の連結を効率的に行う方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IllegalArgumentException この例外を解決する方法
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
SpringBootApplication を型解決できない。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
ローカルリソースのロードが許可されていない場合の解決策