构造函数后面的对象为null

时间:2012-06-27 19:54:40

标签: android eclipse

我正在Eclipse 3.7.2中开发一个Android(API级别7)应用程序。我有一个最奇怪的问题:

有一个名为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);
}

getLoginData()内调用AsyncTask的方法:

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

context是异步任务所在的活动。

现在,当我运行此代码时,loginDatanull。跟踪问题,我在指定位置放置了一个断点1。我发现loginpass都不为空,我看到程序流程转到最后一行return new LoginData(...);。从那里返回...... null

进一步跟踪问题我添加了断点2,却发现构造函数LoginData(...)没有被调用。

所以我的第一个问题是:我错过了一些非常明显的东西吗?如果没有,那么编译和运行的代码就会出现一些奇怪的问题。

一些评论:

  • LoginData用于程序中的其他位置,并且正常工作 - 断点2捕获。
  • 我尝试将LoginData重命名为其他内容,以防它被缓存到某处或者有一个奇怪的名称冲突。
  • 我尝试在Eclipse的Android 2.1模拟器上以及Galaxy Tab上运行它。
  • 我试过清洁&再次建设项目。
  • 我试过关闭&再次打开项目。
  • 我尝试从工作区删除项目并再次导入。

我想避免创建一个新的Eclipse工作区的必要性(这是我最后的机会,在处理Java EE时它帮助了我类似的情况)。

怎么办?

3 个答案:

答案 0 :(得分:2)

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

尝试用

替换此检查
if (login==null || pass==null)

答案 1 :(得分:0)

我可能在这里遗漏了一些东西,但为什么“LoginData”类的构造函数位于一个不同命名的类(“Login”)中?

为什么不让你的班级成为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
}

答案 2 :(得分:0)

好的,这是我的问题。 Utils.isEmpty()是从另一个Utils类导入的,isEmpty()的执行情况很糟糕(基本上是对条件的否定)。

然而,造成这种情况花了这么长时间的问题是,在遇到断点1之后,我没有看到流向return null;,而是转向return new LoginData(login, pass); - 这误导了我...... / p>

感谢任何人的帮助, 毕竟是isEmpty()中的一个问题。