Java 尝试调用虚拟方法';int com.krish.recreatemybank.Models.User.get_id()';在空对象引用上(异步任务)

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 =

我正在创建一个银行应用程序,并使用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 = 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!");
        }
    }
}