Возвращаемое значение из лямбда-функции в фоновом потоке, выбросить NullPointerException - PullRequest
1 голос
/ 06 мая 2020

В моем случае использования я хочу вернуть объект пользователя из лямбда-функции, как в приведенном ниже коде. Перед тем, как опубликовать свой вопрос, я задаю много похожих вопросов, например this и this , но ни одна тема не решает мою проблему, вот мой код:

public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class AppDatabase {

    private static final int NUMBER_OF_THREADS = 4;

    public static final ExecutorService databaseWriteExecutor =
            Executors.newFixedThreadPool(NUMBER_OF_THREADS);

}

public class MyClass {

    private User mUser;

    public User findUser(){
        AppDatabase.databaseWriteExecutor.execute(() -> {
            mUser = work();
        });

        return mUser;
    }

    public User work(){
        //simulate get user from database
        User user = new User();
        user.setName("Toto");
        return user;
    }
}

public class Main {

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        User user;
        user = myClass.findUser();

        System.out.println(user.getName()); //this line: Exception in thread "main" java.lang.NullPointerException
    }
}

Когда я запускаю этот код, я получаю «Исключение в потоке« main »java .lang.NullPointerException». Мой вопрос в том, как мне получить объект User, созданный функцией work (), но эта функция должна работать в фоновом потоке, как в коде.

1 Ответ

1 голос
/ 06 мая 2020

findUser возвращается сразу же и возвращает null, потому что mUser еще не установлен. Вам нужно либо дождаться его установки, либо вернуть Future<User>, которое вызывающий абонент может дождаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...