1

キーとしてユーザー名を含み、値としてユーザーオブジェクトを含むマップを作成して、ユーザーリストに同期しようとしています。マップが作成されると、オブジェクト値を取得するのに問題が発生します。以下は私が使用しているコードです。

private Map<String, User> map = new HashMap<String, User>();

次のようにマップキーとオブジェクトを入力しています。

        List<User> users = session.createCriteria(User.class).list();

        for(ApplicationUser user : users) {
            map.put(user.getUserName(), user);
        }

次のようにデータを取得しようとしています。

        List<Person> persons = session.createCriteria(Person.class).list();
        for (Person p : persons) {
            User user = map.containsKey(p.getUsername()) ? map.get(p.getUsername()) : new User();
            //Email is always null. 
            System.out.println(user.getEmail());
        }

誰かが私のマップからオブジェクト値を取得する方法について正しい方向に私を向けるのを手伝ってもらえますか?ありがとう

4

3 に答える 3

4

まず、ループを次のように変更する必要があります。

   for (Person p : persons) {
        String username = p.getUsername();
        User user = map.get(username);
        if (user != null) {
           System.out.println(user.getEmail());
        } else {
          System.out.println("User " + username + " is unknown");
        }
    }

次に、ループにブレークポイントを設定し、コードをデバッグします。これまでのところ正しいようです。たぶん、あなたは設定emailしていないUserか、からのユーザーpersonsがあなたのmap.

于 2012-05-08T16:05:30.980 に答える
0

ここで実行される User() のデフォルトのコンストラクターで電子メールを初期化していないため、電子メールが null のようです。

ユーザー user = map.containsKey(p.getUsername()) ? map.get(p.getUsername()) : 新しいユーザー();

ここで、マップに入力したユーザー名が、コードの 2 番目の部分で取得しようとしているユーザー名と一致しないと思います。すなわち。map.containsKey(p.getUsername()) は false を返すようで、デフォルトのコンストラクターは email を null として呼び出されます。

マップ keyset() と個人のユーザー名を印刷 (またはデバッグ検査) してみて、それらが正確に一致するかどうかを確認してください。

于 2012-05-08T16:16:47.560 に答える
-1

@George ユーザーが person に属していない場合、nullpointer 例外が発生すると思います。

 System.out.println(user.getEmail());

条件が偽の場合 User user = new User(); user.getEmail() が null です

于 2012-05-08T16:24:30.853 に答える