安全なナビゲーション演算子
null 参照の明示的な順次チェックの代わりに、安全なナビゲーション演算子 (?.) を使用します。この演算子は、null 値を操作しようとする式を除外し、NullPointerException を発生させずに null を返します。
チェーン式の左側が null に評価され���場合、右側は評価されません。安全なナビゲーション演算子 (?.) は、メソッド、変数、プロパティチェーニングで使用します。評価されない式の部分には、変数参照、メソッド参照、または配列式などがあります。
例
- 次の例では、まず a を評価し、a が null の場合に null を返します。それ以外の場合、戻り値は a.b になります。
- 次の例では、a[x] が null に評価される場合に null を返します。a[x] が null に評価されず、aMethod() で null が返される場合、この式で NullPointerException がスローされます。
- 次の例では、a[x].aMethod() が null に評価される場合に null を返します。
- 次の式では、安全なナビゲーション演算子が式で使用されているかどうかに関係なく、式の型が同じであることを示します。
- 次の例では、null をチェックするコードのブロックを置き換える 1 つのステートメントを示します。
- この例では、安全なナビゲーション演算子を使用する 1 行の SOQL クエリを示します。
| 可能な使用事例 | 例 | 詳細情報 |
|---|---|---|
| メソッド、変数、またはパラメータチェーン | aObject?.aMethod(); | 最上位のステートメントとして使用できます。 |
| キャスト内など、括弧の使用。 | ((T)a1?.b1)?.c1() | この演算子は、最初の閉じ括弧までメソッドチェーンをスキップします。括弧の後に演算子を追加することで、このコードは式全体を保護します。演算子を括弧の後以外の場所で使用すると、キャスト式全体が保護されません。たとえば、次の動作を考えます。 |
| sObject チェーニング | String s = contact.Account?.BillingCity; | 関係が null の場合、sObject 式は null に評価されます。その動作は String s = contact.Account.BillingCity と同等です。 |
| SOQL クエリ | String s = [SELECT LastName FROM Contact]?.LastName; |
SOQL クエリでオブジェクトが返されない場合、式は null に評価されます。その動作は次と同等です。
|
場合によっては、安全なナビゲーション演算子を使用できません。このような場合に演算子を使用しようとすると、コンパイル中にエラーが発生します。
- ドットが含まれる種別や静的式。次に例を示します。
- Namespaces
- {Namespace}.{Class}
- Trigger.new
- Flow.interview.{flowName}
- {Type}.class
- 静的変数アクセス、メソッドコール、式。次に例を示します。
- AClass.AStaticMethodCall()
- AClass.AStaticVariable
- String.format('{0}', 'hello world')
- Page.{pageName}
- 割り当て可能な式。次に例を示します。
- foo?.bar = 42;
- ++foo?.bar;
- SOQL バインド式。次に例を示します。
- sObject スカラー項目に addError() が含まれる。次に例を示します。