2012年12月5日水曜日

Javaの疑問:ifの条件式のBooleanオブジェクトがnullだとどうなる?

Javaのbooleanはプリミティブ型なのでnullになることはありませんが,Booleanはオブジェクトなのでnullになりえます.しかしこのように書くと
Boolean b = null;

if (b) {

}
Javaのコンパイラはコンパイルしてくれます.実行するとどうなるのか?という疑問が浮かび,Runtime系のExceptionが出るだろうと予想しながら試してみました.

public class BooleanTest {
    public static void main(String[] args) {
        Boolean b = null;

        if (b) {

        }
    }
}
続きに検証結果があります.

% javac BooleanTest.java
% java BooleanTest
Exception in thread "main" java.lang.NullPointerException
        at BooleanTest.main(BooleanTest.java:5)

NullPointerExceptionが発生しました.

逆コンパイルしてなぜNullPointerExceptionが発生するのか確認してみました.

public class BooleanTest
{
  public static void main(String[] paramArrayOfString)
  {
    Object localObject = null;

    if (localObject.booleanValue());
  }
}

REPLのない言語は簡単な確認をするのも手間ですね.
ScalaのREPLで試すとこうなりました.
scala> val b:Boolean = null
:7: error: type mismatch;
 found   : Null(null)
 required: Boolean
Note that implicit conversions are not applicable because they are ambiguous:
 both method Boolean2booleanNullConflict in class LowPriorityImplicits of type (x: Null)Boolean
 and method Boolean2boolean in object Predef of type (x: java.lang.Boolean)Boolean
 are possible conversion functions from Null(null) to Boolean
       val b:Boolean = null
                       ^


以前,最後に結論があるのを期待すると言われたので最後にもう一度結果を書きます.
NullPointerExceptionが発生します.
Twitterでひしだまさんに教えていただいた通りでした.ありがとうございます.
https://twitter.com/hishidama/status/276246008197939200

0 件のコメント:

コメントを投稿