我正在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
是异步任务所在的活动。
现在,当我运行此代码时,loginData
为null
。跟踪问题,我在指定位置放置了一个断点1。我发现login
和pass
都不为空,我看到程序流程转到最后一行return new LoginData(...);
。从那里返回...... null
。
进一步跟踪问题我添加了断点2,却发现构造函数LoginData(...)
没有被调用。
所以我的第一个问题是:我错过了一些非常明显的东西吗?如果没有,那么编译和运行的代码就会出现一些奇怪的问题。
一些评论:
LoginData
用于程序中的其他位置,并且正常工作 - 断点2捕获。LoginData
重命名为其他内容,以防它被缓存到某处或者有一个奇怪的名称冲突。我想避免创建一个新的Eclipse工作区的必要性(这是我最后的机会,在处理Java EE时它帮助了我类似的情况)。
怎么办?
答案 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()
中的一个问题。