2011-10-29 4 views
3

pausenullの場合、何かを行うにはif(pause == null)を使用します。しかし、私はif(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!"); 
    } 
} 

このクラスは終了していないので、コードの残りの部分を無視します。

+0

「長いポーズ」の代わりに「長いポーズ」を使用してみてください。 – str

+1

あなたは何を複雑にしていますか、ちょうど使用してください、長い休止= 0;あなたがテストをテストするとき(if pause == 0){....} else {...} – Houcine

答えて

3

変数pauselongので、pausenullなることはありませんし、コンパイラが混乱しています。 Longにするか、無効のインバンドインジケータを使用してください。

7
long pause = (Long) null; 

Long pause = null; 
^ 

longであるべきではプリミティブ型あるがLongタイプlongのラッパーオブジェクトあります。

オブジェクトとしてラップする代わりにセンチネルの値を使用できます。 lowecase「l」と

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

_long pause =(Long)null; _に対する余分なコメントとして、それを実行するのが楽しいでしょう。自動アンボクシングのため、すぐにNullPointerExceptionが発生します:) – extraneon

+0

私がそれを行うと、別のエラーが発生します。 –

+0

@extraneon:はい。 –

4

longは、Javaのプリミティブ型で、あなたはそれでnullを格納することはできません。 Nullはクラスへの参照にのみ格納できます。 Longはプリミティブのラッパーであり、実際には参照を格納しています(ヌルにすることができる)ので、longLongに置き換えてください。

お読みください:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
1

longは、classタイプではなく、従ってpausenullできないことを意味オブジェクトは、「参照」ではない、プリミティブ型です。タイマーが一時停止していることを確認できるようにするには、フラグ変数を追加します。 a boolean

あなたはLonglongを変えることができるが、それは不必要と思われる、あなたのコードは次のようなものになると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!"); 
    } 
} 
4

longは原始的です。ヌルにすることはできません。オブジェクト参照のみが可能です。実際に数値にnull値を使用する場合は、型を 'long'からLongに変更します。

1

Java言語は、C#のように、null可能なプリミティブ型の概念をサポートしていません(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ランタイムがアクセスまたは更新するたびに値をボックス化して値をunboxする必要があるため、コストがかかります。コードの使用状況によっては、アプリケーションのパフォーマンスが低下する可能性があります。これにはプロファイリングが必要です。

もう1つの方法は、初期化されていないpauseフィールドを表すために「不可能な」値を使用することです。 pauseが常に正であることがわかっている場合は、-1を使用して初期化されていないフィールドを表すことができます。

関連する問題