Salesforceに特化した情報をお届けします

SalesforceでInvocation TargetExceptionエラーが出たら?対処法を解説
SalesforceでInvocation TargetExceptionエラーの対処法とは?
Salesforceを組織で運用する際にInvocation TargetExceptionエラーが発生してしまう状況に備えて、仕組みとSalesforce上での対処方法について解説していきます。
Salesforceを扱う会社へ転職したあとに、事前にInvocation TargetExceptionエラーが出力される仕組みを理解しておくことで、問題の解決に対してスムーズに解決策へのイメージがしやすくなります。
本記事ではSalesforce上でInvocation TargetExceptionの位置づけから、より早く問題解決へ導くための基本的な仕組みの解説をご紹介していきます。
SalesforceのInvocation TargetExceptionの位置づけ
SalesforceにおいてInvocation TargetExceptionが用いられるケースとしては、組織上でjavaクラスの定義をする局面や、開発者コンソールで各クラスの親クラスや子クラスを定義する場合に、何かしらの問題が発生した場合などにエラーが発生する場合などが挙げられます。
SalesforceではApexが利用されますが、Invocation TargetExceptionはJavaにおけるメソッドの一部で利用されていますので、基本的にApex上ではInvocation TargetExceptionのエラーを見かけることはないでしょう。
したがって次の章ではSalesforceを組織上で運用する場合でのJavaのInvocation TargetExceptionメソッドについて基本的な詳細を解説していきます。
Invocation TargetExceptionについて復習
Invocation TargetExceptionとはJavaのリフレクションAPIのクラスで呼び出されたメソッドに対して、スローされた場合に例外が発生することがあります。その例外をラップする事でチェックの対象外とみなす挙動を示しています。
このターゲット例外はコンストラクタにおいても同様に適応されます。
以下の例ではInvocation TargetExceptionがメッセージを定義しています。
|
1
2
3
4
|
... } catch (InvocationTargetException e) {
log.error("error001 : error Message");
}
|
Invocation TargetExceptionの挙動について
前章に記載した例ではInvocation TargetExceptionでの挙動の理解を深めるために、定義したメッセージをログに出力しています。
しかしあくまで、Invocation TargetExceptionで出力されるエラーは、例外処理が出力されるだけで、メッセージだけの出力では原因が紐とけない場合がありますので注意しましょう。
そのため、Invocation TargetExceptionのメッセージを設定する場合は、単に文字列として出力されることを踏まえて、想定されている原因へ紐づけされる意味を設定するようにしましょう。
リフレクションAPIとは?
リフレクションAPIとはjava.lang.reflectというパッケージ内に存在するAPIのことを示しています。
リフレクションAPIを利用することで、コード内のフィールドや、メソッド、コンストラクタの情報を、前もって定義されたセキュリティー上で操作、実行することが可能になります。
リフレクションAPIを利用する身近なケースとしては、Salesforceの開発を自身のIDEやエディターを利用している場合です。
たとえばコードの補完機能を利用すると同時にString文字はString文字として認識して、IDE内で識別したメタデータを介して適切な補完をするために利用されます。
SalesforceのnvocationTargetExceptionエラーの切り分け方法
Salesforceのシステムが正常に起動しない場合に、java.lang.reflect.InvocationTargetExceptionと言うエラーメッセージが出力されることがあります。
これもInvocationTargetExceptionと記述されていますが、あくまでリフレクションAPIがメソッドを呼び出して、そのメソッド側で例外が発生している状況を示しています。したがってメソッド側の例外からエラーメッセージの発生した原因を調べる必要があります。
getCauseメソッドを利用して原因を切り分ける方法
メソッド側の例外を確認するためにはgetCauseメソッドを利用してください。
|
1
2
3
4
5
6
7
|
省略
} catch (InvocationTargetException e) {
assertThat(e.getCause(), is(instanceOf(IllegalArgumentException.class)));
assertEquals("error message",
e.getCause().getMessage());
}
|
上記の記述ではgetCauseメソッドを利用してInvocationTargetExceptionの原因を取得して表示しています。
ただし必ずしもInvocationTargetExceptionエラーが発生した場合はgetCauseメソッドで原因が見つかるわけでなく、メッセージのnullを返す場合もありますので、その場合は発生した状況に合わせて別の手段を講じましょう。
InvocationTargetExceptionに関係するメソッド
|
1
|
getCause()
|
|
1
|
getTargetException()
|
発生したエラーの内容に応じて対応できるように、各メソッドの挙動について把握しておきましょう。
より詳細な説明は以下のjavadocご参考にしてください。
Apex上ではInvocationTargetExceptionエラーは発生しない
基本的にSalesforceのApex上ではInvocationTargetExceptionエラーは発生しません。そのため、もしエラーが発生しているとすれば、組織上でのクラスに問題が発生している可能性があります。
Salesforceの開発者コンソール上で切り分けをする場合は、エラーが発生する前のクラスを操作していれば、一度クラスを削除してエラーが発生しなくなるか検証してみてください。
よくあるInvocationTargetExceptionが発生する例としては、外部の親クラスが内部クラスに過剰なアクセスをした場合に発生する事があります。
また開発者コンソールではなく、独自のIDEやエディターを利用している場合は、エディター上でのエラーの場合があります。
切り分けに時間がかかることもありますが、まずは一つずつ検証していきましょう。
InvocationTargetExceptionエラーはgetCause()を使おう
InvocationTargetExceptionのエラーはただの文字列ですので、エラーが発生している原因を間接的に見分ける為の役割にしかなりません。
InvocationTargetExceptionが発生する例としては、外部の親クラスが内部クラスに過剰なアクセスをする場合に発生する事があります。また開発者コンソールの代わりに利用している自身のIDE上で発生しているエラーの可能性があります。
Salesforce上でInvocation TargetExceptionが発生した場合はgetCause()メソッドで原因を調査し、それでも問題が解決しない場合は以前に開発者コンソール上で行ったクラスへの操作を見直してみましょう。
Search キーワード検索
Popular 人気の記事
-
Salesforceのキャンペーンとは?使い方や知っておきたい設定4つを紹介
2021年02月01日 -
Salesforceにおける数式とは?注意点や設定サンプルをご紹介
2021年03月05日 -
SalesforceにおけるSandboxとは?種類や使い方をご紹介
2021年02月19日 -
Salesforceの開発入門!開発言語や標準機能を勉強するための方法を解説
2021年02月03日 -
SalesforceにおけるApexとは?特徴や使い方を解説
2021年02月16日
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
Salesforceエンジニアの求人/設計開発/東京都中央区/【WEB面談可】/在宅ワーク
月給80万~80万円東京都中央区(小伝馬町駅) -
Salesforceエンジニアの求人/決済代行システム管理/東京都新宿区/【WEB面談可】/在宅ワーク
月給56万~56万円東京都新宿区(初台駅) -
Salesforceエンジニアの求人/運用保守・開発/東京都文京区/【WEB面談可】/在宅勤務
月給58万~63万円東京都文京区(後楽園駅) -
Salesforceエンジニアの求人/構築/東京都千代田区/【WEB面談可】/在宅勤務
月給50万~50万円東京都千代田区(永田町駅) -
Salesforceエンジニアの求人/運用/東京都品川区/【WEB面談可】/在宅勤務
月給30万~30万円東京都品川区(五反田駅)

