You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端DynamoDB加载用户时出现NullPointerException问题求助

解决AsyncTask导致的NullPointerException问题

嘿,我一眼就看出问题所在了——你掉进了AsyncTask异步执行的坑里啦!

问题根源

你触发空指针的核心原因是AsyncTask的异步特性:当你调用checkIfEmailNull.execute()后,主线程会立刻继续执行后面的if (userB.getUserId() == ...)代码,但这时候后台线程的doInBackground()还没跑完,userB根本还没被赋值,还是个null,调用它的getUserId()方法自然就抛出空指针了。

标准解决方案:把结果处理逻辑移到onPostExecute()

AsyncTask设计的初衷就是让后台任务执行完后,在onPostExecute()(主线程)里处理结果。我们需要修改你的代码,把原本在主线程直接访问userB的逻辑移到这个方法里:

修改后的AsyncTask代码

class CheckIfEmailNull extends AsyncTask<String, Void, SecureUsersDO> {
    private DynamoDBMapper dynamoDBMapper;
    private Profile profileTest; // 传入需要比对的Profile对象

    // 构造方法传入Profile,方便后续在主线程处理逻辑
    public CheckIfEmailNull(Profile profileTest) {
        this.profileTest = profileTest;
    }

    @Override
    protected SecureUsersDO doInBackground(String... userID) {
        AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.getInstance().getCredentialsProvider());
        this.dynamoDBMapper = DynamoDBMapper.builder()
                .dynamoDBClient(dynamoDBClient)
                .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                .build();
        // 直接返回查询到的用户对象,不需要全局变量userB
        return dynamoDBMapper.load(SecureUsersDO.class, userID[0]);
    }

    @Override
    protected void onPostExecute(SecureUsersDO userB) {
        // 这里是主线程,安全处理结果
        if (userB == null) {
            Log.d("CheckIfEmailNull", "未找到对应ID的用户");
            return;
        }

        // 注意用equals比对字符串,不要用==
        if (userB.getUserId().equals(profileTest.getCurrentProfile().getId())) {
            Log.d("ID's match: ", "attempting");
            if (userB.getEmail() == null) {
                Log.d("TODO", "Write code to show we need email");
                Log.d("User B is : ", userB.getFirstName());
            }
        }
    }
}

修改后的启动方法checkUserEmail

public void checkUserEmail(Profile profileTest){
    Log.d("checkUserEmail>>>", profileTest.getId().toString());
    // 把Profile传入AsyncTask的构造方法
    CheckIfEmailNull checkIfEmailNull = new CheckIfEmailNull(profileTest);
    checkIfEmailNull.execute(profileTest.getId().toString());
    // 原来的逻辑已经移到onPostExecute里了,这里不要再处理userB!
}

额外注意事项

  • 永远不要在调用execute()后立刻访问AsyncTask处理的结果,后台线程的执行是异步的,主线程不会等待它完成。
  • 比对字符串时,尽量用equals()而不是==,==比对的是对象引用,equals()才是比对字符串内容。
  • 一定要对查询结果userB判空,避免因为数据库中没有对应ID的用户而再次触发空指针。

内容的提问来源于stack exchange,提问作者Ronald Pitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:52