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:)