Android:适用于mapper的AWS DynamoDB空指针异常

时间:2016-06-28 11:57:35

标签: java android amazon-web-services nullpointerexception amazon-dynamodb

您好我正在尝试将cognito用户ID添加到DynamoDB Users表中。

所以在identityManager.java类中,我在后台调用一个函数来在表中创建用户。

我在mapper.save(用户)行上遇到空指针异常但不确定原因。

这是我创建映射器的地方:

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

2 个答案:

答案 0 :(得分:0)

请检查

mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper()正在给予值或为空。

还要确保在执行代码mapper.save(user);

之前将映射器传递给类addUser

答案 1 :(得分:0)

我很遗憾听到您遇到这个导致NPE的问题。之所以发生这种情况,可能是因为在创建IdentityManager时尚未初始化AWSMobileClient。 IdentityManger负责创建获取Dynamo客户端所需的凭证提供程序,因此无法从IdentityManager的构造函数中检索它。

我建议尝试从异步任务addUser.doInBackground()方法调用AWSMobileClient.defaultMobileClient()。getDynamoDBMapper()。

另外需要指出的是,如果设置一个需要跨线程访问的成员变量,则应将其声明为volatile,或者如果在构造函数中设置它,则应将其声明为final,如果它将从另一个访问线程。

我期待着您的回复。