2012-06-27 3 views
1

Я разрабатываю приложение Android (API уровня 7) в Eclipse 3.7.2. У меня самая любопытная проблема:Объект null сразу после конструктора

Там есть класс называется LoginData держать данные для входа:

public class LoginData { 
    private final String login; 
    private final String password; 

    public LoginData(final String login, final String password) { 
    this.login = login;          // breakpoint 2 here 
    this.password = password; 
    } 

    public String getLogin() { 
    return login; 
    } 
    public String getPassword() { 
    return password; 
    } 
} 

Тогда есть способ его получения (в другом классе):

public static LoginData getLoginData(final Context context) { 
    final SharedPreferences prefs = getPrefs(context); 
    final String login = prefs.getString(LOGIN, null); 
    final String pass = prefs.getString(PASS, null); 
    if (Utils.isEmpty(login) || Utils.isEmpty(pass)) {  // breakpoint 1 here 
    return null; 
    } 
    return new LoginData(login, pass); 
} 

Метод isEmpty() выглядит так:

public static boolean isEmpty(final String s) { 
    return s == null || "".equals(s); 
} 

И метод, вызывающийвнутри AsyncTask:

@Override 
protected WSResult doInBackground(final Params... params) { 
    final LoginData loginData = Prefs.getLoginData(context); 
    ... 

context является деятельностью, в которой задача асинхронной расположена.

Теперь, когда я запускаю этот код, loginData является null. Отслеживая проблему, я помещаю точку останова 1 в указанное место. Я вижу, что и login, и pass не пуст, и я вижу, что поток программы идет до последней строки, return new LoginData(...);. Оттуда он возвращается ... a null.

Отслеживание проблемы далее Я добавляю точку останова 2, только чтобы найти, что конструктор LoginData(...) не вызывает.

Итак, мой первый вопрос: я пропустил что-то действительно очевидное здесь? Если нет, есть какая-то странная проблема с кодом, который компилируется и запускается.

Некоторые замечания:

  • LoginData используется в другом месте в программе, и работает - Точки останова 2 улавливает.
  • Я пробовал переименовать LoginData на что-то еще, на случай, если он кэширован где-то или есть странное имя.
  • Я попытался запустить это на эмуляторе Android 2.1 от Eclipse, а также на Galaxy Tab.
  • Я пробовал очистить & снова здание проекта.
  • Я попытался закрыть &, снова открыв проект.
  • Я попытался удалить проект из рабочего пространства и импортировать его снова.

Я хотел бы избежать необходимости создания нового рабочего пространства Eclipse (это мой последний шанс, это помогло мне в аналогичном случае при работе с Java EE).

Что делать?

+1

в eclipse Я сталкиваюсь с той же проблемой в listAdpater отладчик идет как в случае возврата, так и в другое время возвращаться несколько раз. Также пожалуйста ** предоставить функцию isEmpty здесь ** и использовать SOP один раз, чтобы подтвердить поток и значение lo-gin & pass –

+0

Извините, я не понимаю, что вы подразумеваете под SOP. Я добавляю код 'isEmpty()' сейчас. – vektor

+0

log.d или System.out.println .... –

ответ

2
if (Utils.isEmpty(login) || Utils.isEmpty(pass)) 

попробуйте заменить эту проверку с

if (login==null || pass==null) 
+0

Отмечая это как правильный ответ, поскольку причина была в 'isEmpty()'. Благодарю. – vektor

0

Возможно, мне что-то не хватает, но почему конструктор для класса «LoginData» внутри иначе названного класса («Вход»)?

Почему бы не ваш класс будет LoginData:

public class LoginData 
{ 
    private final String login; 
    private final String password; 

    public LoginData(final String login, final String password) 
    { 
     this.login = login;          // breakpoint 2 here 
     this.password = password; 
    } 

    //Other Methods 
} 
+0

Мой плохой класс действительно имеет имя 'LoginData'. – vektor

+0

уверен, это просто не скомпилировалось. скорее всего, опечатка в имени класса. однако это подозрительный знак любым способом ... –

0

ОК, это моя проблема. Utils.isEmpty() был импортирован из другого Utils класса, который имел плохую реализацию isEmpty() (в основном отрицание этого условия).

Однако проблема, которая привела это так долго, что было после удара точки останова 1 я не видел течь идти к return null;, а скорее return new LoginData(login, pass); - это ввести меня в заблуждение ...

Спасибо за помощь любому , он был проблема в isEmpty() в конце концов.

Смежные вопросы