【问题标题】:Attempt to invoke direct method 'void on a null object reference尝试在空对象引用上调用直接方法 'void
【发布时间】:2020-04-03 09:09:08
【问题描述】:

为什么我会收到错误 Attempt to invoke direct method 'void asyncFinished(com.ats.atsver2.ui.db.classes.User)' on a null object reference。在 onPostExecute 上,我得到了一个结果,但是当我尝试通过委托发送它时,我得到了错误。

这是我的代码:

public class UserRepository {
    private UserDao userDao;
    private User user;
    private LiveData<List<User>> allUsers;

    public UserRepository(Application application) {
        AtsDatabase database = AtsDatabase.getInstance(application);
        userDao = database.userDao();
        allUsers = userDao.getUsers();
    }

    private MutableLiveData<User> userSearched = new MutableLiveData<>();
    private void asyncFinished(User userResult) {
        if(userResult == null) return;
        Log.i("TAG", "asyncFinished: " + userResult.getLastName());
        userSearched.setValue(userResult);
    }

    public LiveData<User> getUserByUserName(String userName) {
        new GetUserByUserNameAsyncTask(userDao).execute(userName);
    }

    public LiveData<List<User>> getAllUsers() { return allUsers; }

    private static class InsertUserAsyncTask extends AsyncTask<User, Void, Void> {
        private UserDao userDao;

        private InsertUserAsyncTask(UserDao userDao) { this.userDao = userDao; }

        @Override
        protected Void doInBackground(User... users) {
            userDao.insert(users[0]);
            return null;
        }
    }

    private static class GetUserByUserNameAsyncTask extends AsyncTask<String, Void, User> {
        private LiveData<User> user;
        private UserDao userDao;
        private UserRepository delegate = null;

        private GetUserByUserNameAsyncTask(UserDao userDao) { this.userDao = userDao; }

        @Override
        protected User doInBackground(String... strings) {
             user = userDao.getUserByUserName(strings[0]); ======> I GET RESULT HERE 
             return null;
        }
        
        @Override
        protected void onPostExecute(User user) {
            super.onPostExecute(user);
            Log.i("TAG", "onPostExecute: "+user.getLastName());
            delegate.asyncFinished(user);
        }
    }
}

除了匿名之外,这个委托在同一个类中,为什么它是一个空对象?我怎样才能做到这一点?

【问题讨论】:

  • 因为你没有初始化委托对象,private UserRepository delegate = null;

标签: android android-asynctask


【解决方案1】:

当您创建一个新的GetUserByUserNameAsyncTask 时,您永远不会将delegate 分配给外部类实例。因为当你调用asyncFinished() 时它是空的,它会抛出一个 NPE。

private static class GetUserByUserNameAsyncTask extends AsyncTask<String, Void, User> {
    private LiveData<User> user;
    private UserDao userDao;
    private UserRepository delegate;

    private GetUserByUserNameAsyncTask(UserDao userDao, UserRepository delegate) { 
        this.userDao = userDao; 
        this.delegate = delegate;
    }

    @Override
    protected User doInBackground(String... strings) {
         user = userDao.getUserByUserName(strings[0]); ======> I GET RESULT HERE 
         return null;
    }

    @Override
    protected void onPostExecute(User user) {
        super.onPostExecute(user);
        Log.i("TAG", "onPostExecute: "+user.getLastName());
        delegate.asyncFinished(user);
    }
}

您现在可以使用您的 UserRepository 实例 (this) 创建它:

public LiveData<User> getUserByUserName(String userName) {
    new GetUserByUserNameAsyncTask(userDao, this).execute(userName);
}

【讨论】:

    【解决方案2】:

    你需要更新这样的代码才能让它工作

    private GetUserByUserNameAsyncTask(UserDao userDao , UserRepository delegate) {
     this.userDao = userDao; 
    this.delegate = delegate ;
    }
    

    【讨论】:

      【解决方案3】:

      您已经创建了具有null 值的delegate 对象:

      private UserRepository delegate = null;
      

      在你为它赋值之后永远不会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多