2012-06-27 228 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()