Тестирование значения Java Long в операторе if.0 = 0 - PullRequest
0 голосов
/ 02 ноября 2010

За всю свою жизнь я не могу понять, почему я не могу заставить этот метод ввести оператор 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?

Я работаю в Eclipse с Java для Android. Спасибо.

редактирует:

@ 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 ]

3 голосов
/ 02 ноября 2010

Я думаю, что ваша проблема с точностью до наоборот.Я только что отладил ваш код, и он работает, проблема в том, что оператор if всегда верен, потому что нет никакого editor.commit () после внесения изменений в переменную FIRST_USE_DATE.

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

Редактировать: IЯ только что попытался отладить ваш реальный код, и произошло то же самое: оператор 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 голосов
/ 02 ноября 2010

Вам знакомы концепции сокрытия и затенения?У вас есть другие переменные, использующие те же имена в этом классе или у одного из его родителей?

Я не думаю, что с вашим кодом что-то не так - попробуйте перезагрузить компьютер (это верно для ОС Microsoft?)

Если это не сработает, удалите нарушающий код (в итоге используйте пустой метод), скомпилируйте и протестируйте, чтобы убедиться в отсутствии ошибок.Затем жестко закодируйте приемлемое значение и протестируйте снова.Наконец, введите код заново - не вставляйте копию.

Однажды, очень давно, у меня было что-то похожее, и оно не исчезло, пока я не ввел код заново - мое лучшее предположение - какой-то скрытый символвызывал проблемы, но я никогда не видел это снова (и при этом я не уверен, что, черт возьми, случилось в то время также).

0 голосов
/ 02 ноября 2010

Вы где-то совершаете ошибку ...

Вы уверены, что не вводите оператор if И этот старт = 0?

Показываете ли вы код, который вы используете?

Вы можете выполнить следующий код (эквивалентный вашему коду)

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

И вы увидите, что вы вводите оператор if ...

0 голосов
/ 02 ноября 2010

Почему бы вам не использовать Long start вместо long и проверять нулевое значение?

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 не проходит.

...