tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:ApexのsObjectとNULLについて

Apexで使用するAccountやContactなどのsObject型は初期値をセットする方法として『new』 する方法と『null』をセットする方法があります。『new』と『NULL』でどのような違いがでるか確認してみます。


確認用のサンプルコードです。

Apex Class

f:id:tyoshikawa1106:20150118161611p:plain

Visualforce Page

f:id:tyoshikawa1106:20150118161621p:plain

上のようにnullをセットする方法の場合、『account.Id』のようにID項目を使用すると『Attempt to de-reference a null object 』エラーが発生します。

f:id:tyoshikawa1106:20150118162024p:plain

『account.Name』や『account.AccountNumber』などのID以外の項目ではエラーが発生しませんが、『ID』項目ではエラーになってしまいます。


これが『new』する方法の場合はエラーとなりません。

f:id:tyoshikawa1106:20150118162416p:plain

f:id:tyoshikawa1106:20150118162445p:plain


このようにNULLでセットしてしまうと『Attempt to de-reference a null object 』が発生してしまう危険があるので初期値としては適切ではありません。初期値をセットするときは『NULL』ではなく『new』を使用するようにした方がいいと思います。


sObjectの初期値をセットする方法としてクエリの実行結果をセットする方法もあります。

f:id:tyoshikawa1106:20150118163644p:plain


このようにリスト型ではないsObjectにクエリ実行結果をセットするとき、実行結果が0件だと『List has no rows for assignment to SObject 』エラーが発生します。

f:id:tyoshikawa1106:20150118163919p:plain


『Account』ではなく『List』のようにして受け取ると、実行結果が0件でもエラーにはならないので次のように処理するのがオススメです。

f:id:tyoshikawa1106:20150118164157p:plain


実行結果が0件の場合は『new』した結果を返し、1件存在した場合はリストの0番目を返すようにします。これでList has no rows for assignment to SObject 』エラーを防止することができます。


ID型のNULL判定ですが、Stirng型と同じように『String.isEmpty()』などの関数が利用できます。

f:id:tyoshikawa1106:20150118164818p:plain


ID型には『account.Id = ''』のようなセットの仕方はできませんが、『account.Id == null』と書くよりも読みやすくなると思ってます。