2013-07-27 4 views
-2
class test 
{ 
    public static myclass x; 

    test() { 
     try { 
      x=new myclass(); 
      //x is not null here 
     } catch(Exception e) {/*stuff*/} 
     //not null here 
    } 

    //x is null here in any other member method 
} 

Veuillez expliquer la raison de ce comportement? Un constructeur n'est-il pas obligé de conserver une valeur plutôt que de la perdre dès la fin d'un bloc de constructeur?Valeur nulle après le constructeur

+1

Il est difficile de dire ce qui se passe sans voir un peu plus de code. Pouvez-vous nous montrer comment et d'où accédez-vous à 'x'? –

+0

Je suis désolé Im grâce à un appareil mobile. Mais l'autre classe est une classe simple normale avec throws Exception pour chaque méthode –

+0

J'ai essayé d'accéder à x à tous les endroits commentés en utilisant x == null if instruction –

Répondre

4

Vous semblez être des valeurs statiques confusion avec les valeurs d'instance.

est statique, mais il n'est pas initialisé dans un bloc d'initialisation statique. Il est seulement initialisé lorsque vous créez une instance de test (via le constructeur pour cette instance). Notez également qu'il sera ré-initialisé chaque fois que vous créerez une nouvelle instance de test, ce qui va probablement causer des bugs très étranges pour vous.

Pour x à initialiser comme une valeur statique pour la classe, l'ajouter à un bloc d'initialisation statique:

class test 
{ 
    public static myclass x; 

    static 
    { 
     x=new myclass(); 
    } 
} 

De cette façon x ne doit être initialisé une fois, de manière statique, lorsque la charge de l'exécution du classe. Cela lui permettrait d'être accédé sans avoir à créer une instance de test, ainsi que de supprimer le bogue de la réinitialisation sur une nouvelle instance de test.

A l'inverse, si cela devrait plutôt être un exemple valeur au lieu d'une valeur statique, vous pouvez simplement changer sa déclaration:

public myclass x; 
1

comme ce code est correct. mais puisque la variable x est static, vous pouvez y accéder avant d'appeler le constructeur. dans ce cas, il sera nul. Dès que le constructeur s'exécute pour la première fois, la valeur de x sera définie sur un nouvel objet.

si vous avez besoin de garder x statique. initialisez-le dans le bloc d'initialisation statique. comme:

class test 
{ 
public static myclass x; 
static { 
    x = new myclass(); 
    } 
} 

ou simplement:

class test 
{ 
public static myclass x = new myclass(); 
} 
+0

Java ne permet pas non statique parce que j'ai une main dans cette classe. C'est pourquoi j'ai vérifié après le constructeur dans une autre méthode. C'était nul là-bas. Cependant, est-ce que j'ai utilisé le "nouveau" à la place de la définition elle-même, aucune erreur n'a été appliquée –

+0

@XperiazX voir mon édition. – Ankit

Questions connexes