0

こんにちは私はDynamoDB UsersテーブルにcognitoユーザーIDを追加しようとしています。Android:AWS DynamoDBマッパーのnullポインタ例外

したがって、identityManager.javaクラスでは、バックグラウンドで関数を呼び出してテーブルにユーザーを作成しています。

mapper.save(ユーザ)行でNULLポインタ例外が発生していますが、その理由はわかりません。

私はマッパーを作成する場所です:私は、ユーザーの追加関数を呼び出すところ

public class IdentityManager { 

    DynamoDBMapper mapper; 

    public IdentityManager() { 
     mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper(); 
    } 

これは、次のとおりです。

private void onCognitoSuccess() { 
      handler.onSuccess(currentIdentityProvider); 

      // Adds a new user 
      new addUser().execute(); 

これは、ユーザーの追加機能である:

public class addUser extends AsyncTask { 

     @Override 
     protected Object doInBackground(Object[] params) { 

      UserDatabaseMappingAdapter user = new UserDatabaseMappingAdapter(); 
      user.setUserID("testUserID"); 
      mapper.save(user); 
      return null; 
     } 

これはgetter/setterのuserDataBaseMappingAdapterです:

@DynamoDBTable(tableName = "UsersBeta") 
public class UserDatabaseMappingAdapter { 

    private String userid; 

    @DynamoDBHashKey(attributeName = "UserID") 
    public String getUserID() { 
     return userid; 
    } 

    public void setUserID(String userid) { 
     this.userid = userid; 
    } 

そして、これは私が取得しています完全なエラーです:

FATAL EXCEPTION: AsyncTask #2 
java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
at com.amazonaws.mobile.user.IdentityManager$addUser.doInBackground(IdentityManager.java:522) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run 
+0

@LaurentYそれを編集すると、それは私に印を付け、問題の悪い形で私を助けようともしません。 –

+0

ここにコードスニペットが掲載されていますが、なぜそれがnullであるのかはわかりません。完全なコードを投稿してください –

答えて

0

をこの

mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper()値はnullを与えているか確認してください。

はまた、私はあなたがNPEにつながるこの問題を持っている聞いてすみませんコードmapper.save(user);

+0

はい、それはnullですが、私はそれがなぜなるのか分かりません? –

0

を実行する前に、そのマッパーがクラスアドユーザーに渡されていることを確認します。 AWSMobileClientがIdentityManagerの作成時にまだ初期化されていないため、これが発生している可能性があります。 IdentityMangerはDynamoクライアントを取得するために必要な資格プロバイダを作成するため、IdentityManagerのコンストラクタから取得することはできません。

非同期タスクのaddUser.doInBackground()メソッドからAWSMobileClient.defaultMobileClient()。getDynamoDBMapper()を呼び出すことをお勧めします。

もう1つのことは、スレッド間でアクセスする必要があるメンバ変数を設定する場合は、volatileとして宣言するか、コンストラクタで設定されている場合は、別のスレッド。

あなたのご意見をお待ちしております。