Java 如果(pause==null){不起作用

Java 如果(pause==null){不起作用,java,android,Java,Android,当pause为null时,我使用if(pause==null)执行某些操作。但是我得到了错误 运算符==未定义参数类型long,null 这是密码 public class Timer extends CountDownTimer { long pause = (Long) null; public Timer(long startTime, long interval) { super(startTime, interval); } @Ove

pause
null
时,我使用
if(pause==null)
执行某些操作。但是我得到了错误

运算符==未定义参数类型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!");
    }
}
此类尚未完成,因此忽略其余代码

long pause = (Long) null;
应该是

Long pause = null;
^
long
是基本类型,但
long
long
类型的包装器对象

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

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

long
和小写字母“l”是java中的一种基本类型,您不能在其中存储
null
。null只能存储在类的引用中。将
long
替换为
long
,它会起作用,因为
long
是基本类型的包装,实际上存储了一个可以为null的引用。

请阅读:
long
是一种基本类型,它不是
类型,因此
pause
不是对象的“引用”,这意味着它不能为
null
。如果您想知道计时器何时暂停,请添加一个标志变量;
boolean

您可以将
long
更改为
long
,但这似乎是不必要的,您的代码可以是这样的,并使用
布尔值:

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

long
是基本变量。它不能为null。只有对象引用可以为null。如果确实要对数字使用null值,请将类型从“long”更改为
long
,变量
pause
是一个
long
,因此
pause
永远不能为
null
,编译器会感到困惑。或者将其设置为ode>Long
,或者使用一些带内无效指示器。

java语言不支持C#所支持的基元类型的可空版本的概念(请参见上的这个问题)。因此,您必须使用
Long
类包装器,而不是
Long
基元类型

public class Timer extends CountDownTimer {
    Long pause = null;

    // Rest of the code ...
}
这将产生成本,因为每次访问或更新值时,java运行时都必须对其进行装箱和取消装箱。这可能会降低应用程序的性能,具体取决于代码的使用情况。这需要进行分析


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

尝试使用
Long pause
而不是
Long pause
。为什么要使事情复杂化,只需使用,Long pause=0;然后当您测试(pause==0){…}否则{…}作为对long pause=(long)null;的额外注释,运行它会很有趣。由于自动取消装箱,您会在那里得到一个NullPointerException:)