2011-10-29 4 views
3

J'utilise if(pause == null) pour faire quelque chose lorsque pause est null. Mais je reçois l'erreurif (pause == null) {ne fonctionne pas

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

Voici le code,

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

Cette classe n'est pas fini, donc ignorer le reste du code.

+0

Essayez d'utiliser 'Long pause 'au lieu de' longue pause'. – str

+1

pourquoi vous compliquer les choses, il suffit d'utiliser, longue pause = 0; et puis quand vous testez test if (pause == 0) {....} else {...} – Houcine

Répondre

3

La pause variable est un long, donc pause ne peut jamais être null, et le compilateur est confus. Soit en faire un Long, ou utiliser un indicateur d'invalidité dans la bande.

7
long pause = (Long) null; 

devrait être

Long pause = null; 
^ 

long est le type primitif mais Long est l'enveloppe objet de type long.

Vous pouvez utiliser une valeur sentinel au lieu de l'emballer comme objet.

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

Comme commentaire supplémentaire sur _long pause = (Long) null; _, l'exécuter serait amusant. En raison de l'auto-déballage, vous obtiendrez une exception NullPointerException :) – extraneon

+0

Si je fais cela, j'ai une autre erreur. –

+0

@extraneon: oui. –

4

long avec un lowecase 'l' est un type primitif en Java, et vous ne pouvez pas stocker null en elle. Null peut être stocké uniquement dans les références aux classes. remplacez votre long par Long, et cela fonctionnera, car Long est un wrapper pour la primitive, stockant en fait une référence, qui peut être nulle.

S'il vous plaît lire: http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

1

long est un type primitif, il n'est pas un type class et donc pause n'est pas une « référence » à un objet, ce qui signifie qu'il ne peut pas être null. Si vous voulez être en mesure de savoir quand la minuterie est en pause, ajoutez une variable flag; un boolean.

Vous pouvez changer long à Long mais cela semble inutile, votre code pourrait être quelque chose comme ça et utiliser un 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 est primitive. Cela ne peut pas être nul. Seules les références d'objets peuvent être. Si vous voulez vraiment utiliser une valeur nulle pour les nombres, changez le type de 'long' à Long.

1

Le langage Java ne supporte pas la notion de version nullable des types primitifs comme le fait C# (voir cette question sur How to present the nullable primitive type int in Java?). Ainsi, vous devrez utiliser le wrapper de classe Long au lieu du type primitif long.

public class Timer extends CountDownTimer { 
    Long pause = null; 

    // Rest of the code ... 
} 

Cela aura un coût, car le moteur d'exécution Java aura à la boîte et Unbox votre valeur chaque fois que vous accédez ou mettre à jour. Selon l'utilisation de votre code, cela peut dégrader les performances de votre application. Cela nécessitera un profilage.

Une autre option consiste à utiliser une valeur "impossible" pour représenter un champ pause non initialisé. Si vous savez que pause sera toujours positif, vous pouvez utiliser -1 pour représenter un champ non initialisé.