if(pause == null){不起作用

时间:2011-10-29 09:32:28

标签: java android

if(pause == null)pause时,我使用null做某事。但我收到了错误

the operator == is undefined for the argument type(s) long,null

这是代码,

public class Timer extends CountDownTimer {
    long pause = (Long) null;

    public Timer(long startTime, long interval) {
        super(startTime, interval);
    }

    @Override
    public void onTick(long millisUntilFinished) {
        content.setText("Tijd over: " + millisUntilFinished / 100);
    }

    public void onPause(long millisUntilFinished) {
        if(pause == null) {
            pause = millisUntilFinished;
            content.setText("Tijd over: " + millisUntilFinished / 100);
            this.cancel();
        }
        else {
            this.start();   
        }
    }

    @Override
    public void onFinish() {
        content.setText("Tijd is op!");
    }
}

此类尚未完成,因此请忽略其余代码。

6 个答案:

答案 0 :(得分:7)

long pause = (Long) null;

应该是

Long pause = null;
^

long原语类型,但Longlong类型的包装对象

您可以使用 sentinel 值,而不是将其包装为对象。

long pause = -1;
...
if(pause == -1 ) {
   //do something
}

答案 1 :(得分:4)

带有低位'l'的

long是java中的基本类型,您不能在其中存储null。 Null只能存储在类的引用中。将long替换为Long,它将起作用,因为Long是基元的包装器,实际存储引用,可以为null。

请阅读: http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 2 :(得分:4)

long是原始的。它不能为空。只有对象引用才可以。如果您确实要为数字使用空值,请将类型从“long”更改为Long

答案 3 :(得分:3)

变量pauselong,因此pause永远不会是null,编译器会感到困惑。要么使它成为Long,要么使用一些无效的带内指示。

答案 4 :(得分:1)

long是基本类型,它不是class类型,因此pause不是对象的“引用”,这意味着它不能是null 。如果您希望能够判断计时器何时暂停,请添加标志变量; boolean

您可以将long更改为Long,但这似乎没必要,您的代码可能是这样的,并使用boolean

public class Timer extends CountDownTimer {
    boolean isPaused = true;
    long pause = 0; // not sure what this is meant to store

    public Timer(long startTime, long interval) {
        super(startTime, interval);
    }

    @Override
    public void onTick(long millisUntilFinished) {
        content.setText("Tijd over: " + millisUntilFinished / 100);
    }

    public void onPause(long millisUntilFinished) {
        if(!isPaused) {
            isPaused = true;
            pause = millisUntilFinished; // don't know what this is for
            content.setText("Tijd over: " + millisUntilFinished / 100);
            this.cancel();
            }
        else {
            this.start();
            isPaused = false;
        }
    }

    @Override
    public void onFinish() {
        content.setText("Tijd is op!");
    }
}

答案 5 :(得分:1)

java语言不像C#那样支持原始类型的可空版本的概念(参见How to present the nullable primitive type int in Java?上的这个问题)。因此,您必须使用Long类包装器而不是long基元类型。

public class Timer extends CountDownTimer {
    Long pause = null;

    // Rest of the code ...
}

这将产生成本,因为每次访问或更新时,Java运行时都必须对您的值进行装箱和取消装箱。根据代码的使用情况,这可能会降低应用程序的性能。这将需要分析。

另一种选择是使用“不可能”的值来表示未初始化的pause字段。如果您知道pause始终是肯定的,那么您可以使用-1来表示未初始化的字段。