おはようございます
駆け出しエンジニアのさわまりんです。
今回は NullPointerException
について、初心者なりに解説します。
NullPointerException
エラーの詳細
NullPointerException
は、
プログラムが「null」の値を使用しようとしたときに出るエラーです。
例として、
あなたは洞窟まで冒険に行くことにしました。そこに行くために地図が必要です。
そのため商人に地図をもらいましたが、その地図の内容が「null」となっていました。
この状況では、地図を参照しても、地図が存在しないのでエラーが発生してしまいます。
(※nullは何もない状態を指します)
このように何かを使用しようとしたり、参照しようとしたりする際に、
そのものがまだ存在していないと、このエラーが発生します。
それでは実際にコードを見ていきましょう。
エラーが出るコード
public class Main {
public static void main(String[] args) {
String string = null;
if( string.isEmpty() ) {
System.out.println("文字列の内容を表示");
}
}
}
どんな処理なのか整理してみましょう。
string
に null
が入っています。
そして、もしも string
に Empty
が入っていたら、
文字列を返す、という処理です。
そして実行してみると以下のエラーが出てきます。
// エラーの内容
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "<local1>" is null
at Main.main(Main.java:5)
原因
エラーの内容を整理しましょう。ただ翻訳するだけでもOKです。
<local1>
が null
なので
String.isEmpty()
を呼び出すことはできない、と言っていますね。
この <local1>
とは 変数string
のことです。
そして、ここで最も重用なのが null
と Empty
の違いです。
NULL :何もない状態
Empty 空文字:長さ0の文字列
もっとわかりやすく表現すると、
NULL :空気すら入れない、真空の箱、完全に何もないイメージ
Empty:空気だけが入っている箱
ここまで説明するとなんとなくわかってくる方もいるのではないでしょうか。
解決策2つ
null
と empty
は完全に異なるものだということが理解できました。
どうやらnullはnullと、emptyはemptyと、そろえる必要がありそうです。
例えば、stringに白紙の地図が入っていた時に、
もしも地図が存在していなかったら、文字列を出力する、
と記述しても意味がないですからね!
それでは hogehoge
部分を揃えてみましょう。
String string = hogehoge;
if( string == hogehoge )
修正後のコード①
public class Main {
public static void main(String[] args) {
String string = null;
if( string == null ) { // string.isEmpty() だった箇所
System.out.println("文字列の内容を表示");
}
}
}
string.isEmpty()
を String string = null;
に合わせて、
string == null
に変更しました。
無事に文字列が表示できました。
// 実行結果
文字列の内容を表示
修正後のコード②
public class Main {
public static void main(String[] args) {
String string = "" ; // String string = null; だった箇所
if( string.isEmpty() ) {
System.out.println("文字列の内容を表示");
}
}
}
String string = null;
を string.isEmpty()
に合わせて、
String string = "" ;
に変更しました。(空文字の状態)
無事に文字列が表示できました。
// 実行結果
文字列の内容を表示
おわりに
今回の説明で NullPointerException
について、少しでも理解できたでしょうか。
もし誰かの助けになっていると幸いです。
ありがとうございました!