2010-01-24 6 views
3

Mon code est quelque chose comme:Comment initialiser un objet d'une classe?

public class Foo { 
    public int a; 
    Bar[] bar = new Bar[10]; 

    a = bar[0].baz; 
} 

public class Bar { 
    public int b; 

    public Bar() { //I tried doing away with this constructor, but that didn't 
        //fix anything 
     b = 0; 
    } 

    public int Baz() { 
     //do somthing 
    } 
} 

Et je reçois un message d'erreur semblable à:

Exception in thread "Foo" java.lang.NullPointerException 

à quelle que soit la ligne de Foo j'essaie d'appeler une fonction ou à la valeur de la barre de classe. Comment puis-je empêcher la barre [] d'être nulle?

EDIT: Après quelques manipulations, j'ai finalement réussi à le réparer, merci à tous! Cependant, je ne pouvais pas appeler le constructeur pour arranger les choses; J'ai dû créer une autre fonction et appeler cette fonction depuis Main (dans mon cas, la classe Foo est en fait la classe Main, si cela a vraiment de l'importance). Mon résultat final:

public class Foo { 
    public int a; 
    Bar[] bar = new Bar[10]; 

    public Foo() { //this constructor wasn't called for some reason... I checked this 
        //by using System.out.println... no message was print onscreen 
     for (int a = 0; a < bar.length; a++) 
      bar[a] = new Bar(); 
    } 

    public static void initializeFoo() { 
     for (int a = 0; a < bar.length; a++) 
      bar[a] = new Bar(); 
    } 

    public static void Foo() { 
     initializeFoo(); 
     a = bar[0].baz; 
    } 
} 

Quelqu'un veut-il m'aider avec cela, ou suis-je censé créer une autre question? :)

+0

De la même manière que vous le faites toujours: initialisez-le pour pointer vers un objet sur le tas. – duffymo

+0

Si vous voulez de l'aide avec votre code, vous devrez nous montrer le code qui cause réellement le problème, pas un autre code qui, selon vous, représente le problème, mais il manque des bits vitaux et ne compile même pas. –

+0

@Michael Merci, je le ferai la prochaine fois – wrongusername

Répondre

6

Vous avez allouer de la mémoire pour les références en écrivant ce Bar[] bar = new Bar[10]; mais qui allouer de la mémoire pour les éléments du tableau? Les tableaux d'infact de types de référence sont initialisés avec des références nulles.

Vous devez allouer de la mémoire à des éléments du tableau aussi:

for(int i=0; i<bar.length; ++i) 
    bar[i]=new Bar(); 
3

La raison pour laquelle vous obtenez un NullPointerException est à cause de cette ligne:

a = bar[0].baz; 

bar[0] n'existe pas encore.

Ce qui se passe est que lorsqu'un Foo est en cours d'initialisation, ses initialiseurs par défaut s'exécutent (comme la ligne mentionnée ci-dessus). Vous construisez bar sous la forme d'un tableau de références Bar, mais n'initialisez pas les emplacements individuels dans le tableau. Si vous voulez qu'ils soient tous initialisés, vous devez faire quelque chose comme ceci:

public Foo() { 
    bar = new Bar[10]; 
    for (int i = 0; i < 10; i++) { 
     bar[i] = new Bar(); 
    } 
    a = bar[0].baz; 
} 
1

Essayez ceci:

public class Foo 
{ 
    public int a; 
    Bar[] bar = new Bar[10]; 

    public Foo() 
    { 
     for (int i = 0; i < 10; ++i) 
     { 
      this.bar[i] = new Bar(); 
     } 
    } 
    a = bar[0].baz(); 
} 

public class Bar 
{ 
    public int b; 


    public int baz() 
    { 
     return b; 
    } 
} 
+0

le 'b = 0' dans le constructeur est redondant. et le codage en dur 10 à deux endroits n'est pas agréable;) – Bozho

+0

sûr, mais c'est son code. Je ne fais que réparer un problème à la fois. – duffymo

+0

juste pour rappeler :) – Bozho

8
Bar[] bar = new Bar[10]; 

a = bar[0].baz; 

Le ci-dessus crée un tableau de type barre, mais ne remplit pas avec tous les objets Bar réels. Les tableaux de types de référence sont initialisés avec des références nulles. Vous devez faire ceci:

for(int i=0; i<bar.length; i++) { 
    bar[i] = new Bar(); 
} 
+0

merci! cela a fonctionné, mais pour une raison quelconque, je n'ai pas pu obtenir le constructeur pour que cela fonctionne; Je devais utiliser ce code dans une autre méthode – wrongusername

1

Juste après Bar[] bar = new Bar[10], votre tableau de bar est initialisé avec des valeurs nulles. Donc bar[0] contient null et l'appel bar[0].baz provoquerait un NullPointerException. Vous devez remplir votre tableau avec une instruction comme bar[0] = new Bar(). Ou

for (int i = 0; i < bar.length; i++) { 
    bar[i] = new Bar(); 
} 
1

La question clé ici est une mauvaise compréhension de array initialization in Java. L'initialisation de bar [] sera "10 références de barre qui sont nulles".

Voici un exemple corrigé (il n'utilise 10), mais il est pas très bon style Java pour d'autres raisons (par exemple, les membres du public):

class Foo { 
    Bar[] bar = new Bar[] { new Bar(), new Bar() }; 
    public int a = bar[0].b; 
} 

public class Bar { 
    public int b = 0; 

    public static void main(String... args) { 
     Foo foo = new Foo(); 
     System.out.println(foo.a); 
    } 
} 

Cet exemple est plus proche du vrai style de Java:

class Foo { 
    static final int numBars = 10; 
    private Bar2[] bar = new Bar2[numBars]; 
    private int a; 

    public int getA() { return a; } 

    public Foo() { 
     for (int i = 0; i < numBars; i++) { 
      bar[i] = new Bar2(); 
     } 
     a = bar[0].getB(); 
    } 
} 

public class Bar2 { 
    private int b = 0; 
    public int getB() { return b; } 

    public static void main(String... args) { 
     Foo foo = new Foo(); 
     System.out.println(foo.getA()); 
    } 
} 
1

Plusieurs réponses correctes à partir desquelles travailler. Certaines questions que je pense que vous pourriez avoir:

  • Un constructeur de Foo serait Foo() {/ * ... * /} le code non seulement placer n'importe où dans la classe.
  • Au lieu d'utiliser une boucle vous-même, vous pouvez utiliser java.util.Arrays.fill (Object [] un objet val)

comme ceci:

public class Foo { 
    public int a; 
    Bar[] bar = new Bar[10]; 

    Foo() { 
     java.util.Arrays.fill(bar, new Bar()); 
     a = bar[0].baz(); 
    } 
} 

Edit: Pour mise à jour question, il suffit d'appeler nouveau Foo() à partir de votre principale (...) méthode. En outre, vous ne pouvez pas avoir un constructeur statique comme vous le faites.

1

Quelques réponses et commentaires à votre code:

Le constructeur ne soit pas appelé lui-même, vous l'appelez activly avec la déclaration new Foo()

Votre méthode initializeFoo() ne compile pas. La méthode est statique et ne peut pas accéder à un membre de classe non statique (comme bar dans votre cas). Et enfin, public static void Foo() n'est pas un constructeur mais une méthode. Un constructeur n'a pas de type de retour (void dans votre cas).

Questions connexes