2012-06-27 72 views
1

后的对象null我在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时的类似情况)的必要性。

怎么办?

+1

在eclipse中我在listAdpater调试器中遇到同样的问题,如果返回并且在else中返回一些时候..所以请在这里提供isEmpty函数**并使用SOP一次来确认流和Lo-gin值和传递值 –

+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

OK更换此检查,这是我的问题。 Utils.isEmpty()正在从另一个Utils类导入,其中isEmpty()的执行错误(基本上是条件的否定)。

然而,导致这种采取这么长时间是打断点1后,我没有看到流去return null;,而是return new LoginData(login, pass);问题 - 这误导我...

感谢您的帮助任何人它毕竟是有问题isEmpty()