尝试在空对象引用上调用直接方法 'void
Attempt to invoke direct method 'void on a null object reference
为什么我会收到错误 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);
}
}
}
除了匿名之外,这个委托在同一个 class 中,为什么它是一个空对象?我怎样才能做到这一点?
您已创建 delegate
对象,其 null
值:
private UserRepository delegate = null;
而且永远不会在您为其赋值之后。
当您创建新的 GetUserByUserNameAsyncTask
时,您永远不会将 delegate
分配给外部 class 实例。因为当你调用 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);
}
您需要像这样更新代码才能使其正常工作
private GetUserByUserNameAsyncTask(UserDao userDao , UserRepository delegate) {
this.userDao = userDao;
this.delegate = delegate ;
}
为什么我会收到错误 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);
}
}
}
除了匿名之外,这个委托在同一个 class 中,为什么它是一个空对象?我怎样才能做到这一点?
您已创建 delegate
对象,其 null
值:
private UserRepository delegate = null;
而且永远不会在您为其赋值之后。
当您创建新的 GetUserByUserNameAsyncTask
时,您永远不会将 delegate
分配给外部 class 实例。因为当你调用 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);
}
您需要像这样更新代码才能使其正常工作
private GetUserByUserNameAsyncTask(UserDao userDao , UserRepository delegate) {
this.userDao = userDao;
this.delegate = delegate ;
}