[JAVA]Array van Object in Inner Class

Pagina: 1
Acties:

  • wibra
  • Registratie: Januari 2005
  • Laatst online: 04-02 19:35
om met de deur in huis te vallen, zie hier simpel schema'tje:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class A {
    public B myB;
    
    A(){myB=new B();}
    
    public class B{
        public C[] alotofC;
    
        public class C{
            String D;
        }
    }
}


op een gegeven moment wil ik dus een objectje van A maken, en netjes alle parameters invullen.
zo dus:

Java:
1
2
3
4
5
6
7
8
public class Handler {
    
    public static void main(String[] args){
        A myA=new A();
        myA.myB.alotofC = new A.B.C[5];
        myA.myB.alotofC[0].D="test";
    }
}


op die laatste regel code krijg ik echter een nullpointerException.
ik dus blijkbaar een array van objecten C's, die allemaal "null" zijn.
wat geen oplossing is, is eerst een objectje C maken van D (door externe omstandigheden).

lijkt me iets dat vrij klassiek is, alleen zit ik er nu toch al een paar uur mee te prutsen en ik kom er niet uit :(

een ervaren coder moet dit wel al ontelbaar keer zijn tegengekomen, is hier een elegante oplossing voor?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class A {
    public B myB;
    
    A(){myB=new B();}
    
    public class B{
        public C[] alotofC = new C[5];

       public B( ) {

        for( int i = 0; i < alotofC.length; ++i )
          alotofC[i] = new C();
       }
    
        public class C{
            String D;
        }
    }
}


Ga niet die array aanmaken in je main class, maar laat de klasse er lekker zelf voor verantwoordelijk zijn. Het mooiste is natuurlijk de constructor, dan kun je garanderen dat de array gemaakt en gevuld is als het object gemaakt is.

[edit] Bij arrays zul je meer zelf moeten doen. Collections zijn wat dat betreft toch een stukje eleganter vind ik :)

[ Voor 45% gewijzigd door Glimi op 19-05-2005 22:14 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 06-05 11:35
als je een array aanmaakt, dan maakt java de array aan en vult deze op met de default waardes(tenzij je zelf de initiele waardes meegeeft)
de default waarde van een object is null

Wat je met "myA.myB.alotofC = new A.B.C[5];" bereikt hebt, is dat je nu een array hebt met lengte 5 waar je objecten van het type C kunt insteken. Als je niet eerst elk element initialiseerd, dan ga je altijd null-pointers krijgen.

De oplossing is dus dat je met een for lusje elk element in de array aanmaakt:
code:
1
2
3
myA.myB.alotofC = new A.B.C[5];
for(int x=0;x<5;x++)
  myA.myB.alotofC[x] = new A.B.C();


of:
code:
1
myA.myB.alotofC = new A.B.C[] {new A.B.C(), new A.B.C(), new A.B.C(), new A.B.C(), new A.B.C(),}

  • wibra
  • Registratie: Januari 2005
  • Laatst online: 04-02 19:35
Glini:
nja, maar mn objectje weet wel niet hoelang C gaat zijn, dus kan ik dat daar niet zetten. ik heb er op voortgeborduurd, en een constructor voor B gemaakt die een int aanneemt als argument, en dan mooi mn arraytje initialiseert.
ECHTER
Java:
1
2
3
4
5
6
7
8
public class Handler {
    
    public static void main(String[] args){
        A myA=new A();
        myA.myB = new A.B(5);
        myA.myB.alotofC[0].D="test";
    }
}

dit lukt dus niet, er is een fout bij die "new".

Darkie:
ook even uitgetest, maar dan krijg je dezelfde fout

myA.myB.alotofC[x]=new A.B.C();

geeft dus een heleboel shit. zijnde:

code:
1
2
No enclosing instance of type A.B is accessible. Must qualify the allocation with an enclosing 
 instance of type A.B (e.g. x.new A() where x is an instance of A.B).


edit: ik had iets dergelijks als darkie al uitgeprobeerd, mijn excuses voor het niet eerder vermelden. maar ik dacht dat dit eenvoudiger ging zijn ;(
doet me denken aan mijn leerkracht van toen ik 10 jaar was
Iets kan eenvoudig zijn maar toch moeilijk. En iets ingewikkeld kan ook simpel zijn.

[ Voor 19% gewijzigd door wibra op 19-05-2005 22:33 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 06-05 11:35
inderdaad, was ik even vergeten. Je kan een inner class enkel instantieren via de instantie van de enclosing class, dus in dit geval:

new A(). new B().new C();

deze code werkt dus wel:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
    public static void main(String [] a) {
            A myA=new A(); 
            myA.myB.alotofC = new A.B.C[5];
            for(int x=0 ; x<5;x++)
                myA.myB.alotofC[x] = myA.myB.new C();
            myA.myB.alotofC[0].D="test";
    }
}

class A { 
    B myB; 
     
    A(){myB=new B();} 
     
    class B{ 
        C[] alotofC; 
     
        class C{ 
            String D; 
        } 
    } 
}

[ Voor 31% gewijzigd door DaRKie op 19-05-2005 22:50 ]


  • wibra
  • Registratie: Januari 2005
  • Laatst online: 04-02 19:35
wibra schreef op donderdag 19 mei 2005 @ 22:01:

wat geen oplossing is, is eerst een objectje C maken van D (door externe omstandigheden).
echter!!!

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class A {
    public B myB;
    
    A(){myB=new B();}
    
    public class B{
        public C[] alotofC;

        B(){}
        
        public void init(){
            for(int i=0;i<alotofC.length;i++){
                this.alotofC[i]=new C();
            }
            
        }
    
        public  class C{
            String D;
        }
    }
}


gevonden!!!!!

bedankt voor de inspiratie, moet nu weg voor de poort van t school sluit :)
Pagina: 1