在if语句中测试Java Long值。 0!= 0

时间:2010-11-02 13:17:46

标签: java android eclipse long-integer

对于我的生活,我无法弄清楚为什么我不能让这种方法进入if语句。

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);        
    }

返回true;     }

请注意,日志和调试模式显示“start = 0”

我也试过

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

我在这里错过了什么? 0!= 0?

我正在使用Java for Android开发Eclipse。感谢。

编辑:

@methodin - 没有抱歉,这不起作用。

@Aioobe - 我在IF声明下有一个断点,永远不会发生。

Edit2:这是我问你以后运行的实际代码。

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;
    }

4 个答案:

答案 0 :(得分:3)

我认为你的问题恰恰相反。 我刚刚调试了你的代码并且它有效,问题是if语句总是正确的,因为在对FIRST_USE_DATE变量进行更改后没有editor.com()。

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语句始终为true并且每次都会生成,因为没有editor.commit()将更改保存到FIRST_USE_DATE变量。 / p>

    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;
}

答案 1 :(得分:0)

为什么不使用Long start而不是long并检查null值?

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检查没有通过。

答案 2 :(得分:0)

你在某处犯了错误......

您确定没有输入if语句并且start = 0?

您是否向我们展示了您正在运行的代码?

您可以执行以下代码(相当于您的代码)

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

你会看到你输入if语句......

答案 3 :(得分:0)

您熟悉隐藏和阴影的概念吗?您是否在此类或其父级之一中使用相同的名称?

我认为您的代码没有任何问题 - 尝试重新启动计算机(它的Microsoft操作系统正确吗?)

如果不起作用,请删除有问题的代码(最后用空方法)编译并测试以确保没有错误。然后硬编码可接受的值并再次测试。最后重新输入您的代码 - 不要粘贴副本。

很久很久以前,我有类似的东西,直到我重新输入代码才消失 - 我最好的猜测是一些隐藏的角色造成了问题,但我再也没见过(也不是我确定那个时候到底发生了什么。)