2010-11-02 36 views
0

對於我的生活,我無法弄清楚爲什麼我不能讓這種方法進入if語句。在if語句中測試Java Long值。是否0!= 0

protected void foo() { 
    Date d = new Date(); 
    long now = d.getTime(); 

    long start; 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    start = settings.getLong(FIRST_USE_DATE, 0); 
    Log.w(this.getClass().getName(), Long.toString(start));  

    if (start == 0) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putLong(FIRST_USE_DATE, now);   
    } 

return true; }

請注意,日誌和調試模式顯示「開始= 0」

我也試過

if (start == 0l) { 
if (start == 0L) { 

我在這裏缺少到底有什麼? 0!= 0?

我正在Eclipse中使用Java進行Android開發。謝謝。

編輯:

@methodin - 沒有抱歉,這是行不通的。

@Aioobe - 我在IF語句下有一個斷點,永遠不會發生。

編輯2:這是我詢問後運行的實際代碼。

protected boolean isDemoExpired() { 
    Date d = new Date(); 
    long now = d.getTime(); 

    long demoStart; 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    demoStart = settings.getLong(FIRST_USE_DATE, 0);   

if (demoStart == 0) { 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putLong(FIRST_USE_DATE, now); 
    System.out.println(Long.toString(demoStart)); 
    return false; 

} 
return true; 
    } 
+0

if((long)start == 0) – methodin 2010-11-02 13:20:39

+0

您是否在if分支中添加了調試輸出?你確定它沒有進入嗎? – aioobe 2010-11-02 13:21:28

+0

編輯原始帖子以供評論。 – user432209 2010-11-02 13:52:05

回答

3

我覺得你的問題是完全相反的。 我剛剛調試了你的代碼,它的工作原理是,if語句總是爲true,因爲在對FIRST_USE_DATE變量進行更改後沒有editor.commit()。

protected void foo() { 
    Date d = new Date(); 
    long now = d.getTime(); 

    long start; 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    start = settings.getLong(FIRST_USE_DATE, 0); 
    Log.w(this.getClass().getName(), Long.toString(start));  

    if (start == 0) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putLong(FIRST_USE_DATE, now); 
     ***editor.commit();***  
    } 
} 

編輯:我只是試着調試你的實際代碼,同樣的事情發生了:if語句,它總是真實,它被製成每一次,因爲沒有editor.commit()將更改保存到FIRST_USE_DATE變量。

protected boolean isDemoExpired() { 
    Date d = new Date(); 
    long now = d.getTime(); 

    long demoStart; 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    demoStart = settings.getLong(FIRST_USE_DATE, 0);   

    if (demoStart == 0) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putLong(FIRST_USE_DATE, now); 
     ****editor.commit();**** 
     System.out.println(Long.toString(demoStart)); 
     return false; 

    } 
    return true; 
} 
+0

你是對的,那確實解決了問題。現在我很困惑,爲什麼我的斷點不能正常工作! – user432209 2010-11-02 15:31:47

0

爲什麼不使用長啓動而不是長檢查空值?

protected void foo() { 
    Date d = new Date(); 
    long now = d.getTime(); 

    Long start; 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    start = settings.getLong(FIRST_USE_DATE, 0); 
    Log.w(this.getClass().getName(), Long.toString(start));  

    if (start == null) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putLong(FIRST_USE_DATE, now);   
    } 
} 

看來自動拆箱在這裏發生,你得到零價值。另一個問題是爲什麼0 == 0檢查不通過。

+0

此代碼不會編譯。龍的不能爲空。 – user432209 2010-11-02 13:51:08

+0

長與大寫'L'肯定可以爲空,但拆箱時會失敗。您將需要更新您的條件邏輯:「start == null || start == 0」 – 2010-11-02 13:56:56

+0

好的,我明白了。不幸的是,這並不能解決問題。 – user432209 2010-11-02 14:18:21

0

你犯了一個錯誤的地方...

你確定你是不是進入if語句和啓動= 0?

您是否向我們展示了您正在運行的代碼?

你可以執行以下代碼(相當於你的代碼)

public static void main(String[] args) { 
    long start = 0; 
    if (start == 0) { 
     System.out.println(Long.toString(start)); 
    } 
} 

而且你會看到你輸入的if語句...

+0

是的,我試過了,它的工作更早。這就是爲什麼我很困惑。 – user432209 2010-11-02 14:12:05

0

您是否熟悉隱藏和遮蔽的概念?在這個班或其父母中有沒有其他變量使用相同的名字?

我不認爲你的代碼有什麼問題 - 嘗試重新啓動計算機(它是微軟操作系統的權利?:)

如果這樣做不起作用刪除有問題的代碼(最後用一個空方法)編譯和測試,以確保沒有錯誤。然後硬編碼一個可接受的值並再次測試。最後重新輸入你的代碼 - 不要粘貼副本。

有一次,很久以前,我有類似的東西,直到我重新輸入代碼才消失 - 我最好的猜測是某個隱藏的字符引發了問題,但我再也沒有看到過它(或者我是否確定那次發生了什麼)。