1

我正在 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。我看到两者login都不pass是空的,我看到程序流程转到最后一行,return new LoginData(...);. 从那里它返回... a null

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

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

一些备注:

  • LoginData在程序的另一个位置使用,并且可以工作 - 断点 2 接上来。
  • 我尝试重命名LoginData为其他名称,以防它缓存在某处或出现奇怪的名称冲突。
  • 我尝试在 Eclipse 的 Android 2.1 模拟器以及 Galaxy Tab 上运行它。
  • 我再次尝试清理和构建项目。
  • 我尝试再次关闭和打开项目。
  • 我尝试从工作区中删除项目并再次导入。

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

该怎么办?

4

3 回答 3

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

尝试将此检查替换为

if (login==null || pass==null)
于 2012-06-27T20:19:28.583 回答
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
}
于 2012-06-27T20:14:12.500 回答
0

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

然而,导致这需要这么长时间的问题是,在达到断点 1 后,我没有看到流程转到return null;,而是return new LoginData(login, pass);- 这误导了我......

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

于 2012-06-27T20:32:18.270 回答