Java 尝试调用虚拟方法';int com.krish.recreatemybank.Models.User.get_id()';在空对象引用上(异步任务)
我正在创建一个银行应用程序,并使用AsyncTask获取用户进行的所有交易 在这里,我只是在执行异步任务,但由于某些原因,我得到了一个空指针异常:Java 尝试调用虚拟方法';int com.krish.recreatemybank.Models.User.get_id()';在空对象引用上(异步任务),java,android,json,nullpointerexception,sharedpreferences,Java,Android,Json,Nullpointerexception,Sharedpreferences,我正在创建一个银行应用程序,并使用AsyncTask获取用户进行的所有交易 在这里,我只是在执行异步任务,但由于某些原因,我得到了一个空指针异常: Attempt to invoke virtual method 'int com.krish.recreatemybank.Models.User.get_id()' on a null object reference 这是我的utils代码: Utils utils = new Utils(this); User user =
Attempt to invoke virtual method 'int com.krish.recreatemybank.Models.User.get_id()' on a null object reference
这是我的utils代码:
Utils utils = new Utils(this);
User user = utils.isUserLoggedIn();
Log.d("user_id", user.get_id()+"");
getTransactions = new GetTransactions();
getTransactions.execute(user.get_id());
空指针异常发生在行。执行
以下是我的两个Util方法:
public void addUserToSharedPreferences(User user){
SharedPreferences sharedPreferences = context.getSharedPreferences("logged_in_user", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
editor.putString("user", gson.toJson(user));
editor.apply();
}
public User isUserLoggedIn(){
SharedPreferences sharedPreferences = context.getSharedPreferences("logged_in_user", Context.MODE_PRIVATE);
Gson gson = new Gson();
Type type = new TypeToken<User>(){}.getType();
User user = gson.fromJson(sharedPreferences.getString("user", null), type);
return user;
}
另外,我尝试过多次记录该用户,但该用户不是空的
这里可能出了什么问题?
完整堆栈跟踪:
2021-05-25 19:14:32.106 5575-5604/com.krish.recreatemybank E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.krish.recreatemybank, PID: 5575
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.krish.recreatemybank.Models.User.get_id()' on a null object reference
at com.krish.recreatemybank.HelperClasses.DatabaseHelper.addSampleTransaction(DatabaseHelper.java:67)
at com.krish.recreatemybank.HelperClasses.DatabaseHelper.onCreate(DatabaseHelper.java:60)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:340)
at com.krish.recreatemybank.Auth.RegisterActivity$DoesUserExist.doInBackground(RegisterActivity.java:73)
at com.krish.recreatemybank.Auth.RegisterActivity$DoesUserExist.doInBackground(RegisterActivity.java:68)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
谢谢
异步任务的代码:
公共类GetTransactions扩展异步任务{
@覆盖
受保护的ArrayList doInBackground(整数…整数){
试一试{
SQLiteDatabase db=databaseHelper.getReadableDatabase();
Cursor Cursor=db.query(“事务”,null,“用户id=?”,新字符串[]{String.valueOf(整数[0])},null,null,null);
如果(光标!=null){
if(cursor.moveToFirst()){
ArrayList事务=新建ArrayList();
对于(int i=0;我可以显示异步任务的代码。日志.d是否也显示用户ID?嗨,我不知道为什么,但我的日志甚至没有显示,即使我知道代码正在运行。即使在应用程序的工作版本中,也没有任何日志记录。我关闭了Android Studio,重新打开它,没有任何更改。我已经解决了错误,但没有更改回收器视图仍然没有显示事务。我也为异步任务添加了代码。我非常确定userID返回null,请尝试Log.e(“userID”,user.get_id())。这将以红色显示日志,更容易找到。或者控制台中有搜索功能,所以只需搜索userID。@codingChampHi,我修复了日志错误,userID不为null。它记录为1。我还修复了崩溃错误,但问题是--recycler视图仍然没有显示事务
2021-05-25 19:14:32.106 5575-5604/com.krish.recreatemybank E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.krish.recreatemybank, PID: 5575
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.krish.recreatemybank.Models.User.get_id()' on a null object reference
at com.krish.recreatemybank.HelperClasses.DatabaseHelper.addSampleTransaction(DatabaseHelper.java:67)
at com.krish.recreatemybank.HelperClasses.DatabaseHelper.onCreate(DatabaseHelper.java:60)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:340)
at com.krish.recreatemybank.Auth.RegisterActivity$DoesUserExist.doInBackground(RegisterActivity.java:73)
at com.krish.recreatemybank.Auth.RegisterActivity$DoesUserExist.doInBackground(RegisterActivity.java:68)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
@Override
protected ArrayList<Transaction> doInBackground(Integer... integers) {
try{
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("transactions", null, "user_id=?", new String[]{String.valueOf(integers[0])}, null, null, null);
if(cursor != null){
if(cursor.moveToFirst()){
ArrayList<Transaction> transactions = new ArrayList<>();
for(int i = 0; i<cursor.getCount(); i++){
Transaction transaction = new Transaction();
transaction.setDate(cursor.getString(cursor.getColumnIndex("date")));
transaction.setDescription(cursor.getString(cursor.getColumnIndex("description")));
transaction.setPrice(cursor.getDouble(cursor.getColumnIndex("amount")));
transaction.setTitle(cursor.getString(cursor.getColumnIndex("title")));
transaction.setTransactionId(cursor.getInt(cursor.getColumnIndex("_id")));
transactions.add(transaction);
cursor.moveToNext();
Log.d("transactions", String.valueOf(transactions));
}
cursor.close();
db.close();
return transactions;
}else{
cursor.close();
db.close();
return null;
}
}else{
db.close();
return null;
}
}catch (SQLException e){
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(ArrayList<Transaction> transactions) {
super.onPostExecute(transactions);
if(transactions != null){
initAdapter(transactions);
Log.d("transactions", "Sucess!");
}else{
Log.d("transactions", "Failure!");
}
}
}