Newsgroup: it.comp.java
Titolo: [niubbo] Array di classi

Voglio creare un array di classi, ma non ci riesco. Con questo codice:
public class Viaggio {
 static Stazione[] stazioni;
 public static void caricamento(){
  stazioni[0].setName("Roma");
  stazioni[0].treni[0].setName("Treno1");
  stazioni[0].treni[1].setName("Treno2");
  stazioni[0].treni[2].setName("Treno3");
  stazioni[1].setName("Napoli");
  stazioni[2].setName("Ancona");
  stazioni[3].setName("Firenze");
  System.out.println("Nome della stazione 0 " + stazioni[0].getName());
 }
 public static void main(String[] args){
  caricamento();
}
}
Mi da questo errore a RunTime
Exception in thread "main" java.lang.NullPointerException
        at Viaggio.caricamento(Viaggio.java:5)
        at Viaggio.main(Viaggio.java:16)
Se invece al posto di static Stazione[] stazioni; ci metto Stazione[]
stazioni = new Stazione[3]; mi da errore di compilazione dicendomi
non-static variable stazioni cannot be referenced from a static context
stazioni[0].setName("Roma"); e poi a tutte le altre chiamate.
Come posso risolvere per far fare quello che voglio. Scusate se č un
problema stupido ma ho appena iniziato a studiare Java.

  static Stazione[] stazioni;
Come probabilmente sai dichiarare e inizializzare sono due cose diverse.
Qui dichiari una array di oggetti Stazione, ma non lo inizializzi. Quando la
classe viene caricata l'array è inizializzato al valore di default, cioé
null. 
Quindi come minimo da qualche parte dovrai mettere
stazioni = new Stazione[dimensione];
Ma non è finita qua. Questo crea un array di riferimenti a loro volta
inizializzati a null. Devi anche riempire l'array.
for(int i =0; i<stazioni.length; i++)
  stazioni[i] = new Stazione();
Dopo questo dovrebbe funzionare.
Ciao
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/

 non-static variable stazioni cannot be referenced from a static context
Mi era sfuggita la seconda parte della domanda :) Nel codice che hai scritto
qui non si dovrebbe verificare questo problema perché sono static sia
l'arrray sia il metodo che lo usa.
Per chiarezza: una variabile static è della classe, quindi puo' essere
acceduta sia da metodi static (cioé anche loro della classe) sia da quelli
che non lo sono (che quindi appartengono ad ogni oggetto della classe). Al
contrario una variabile non static appartiene ad ogni signolo oggetto, ed
ognuno ne ha una propria, quindi è chiaro che non puoi accedere a questa da
un metodo statico perché il metodo appartiene alla classe e non si sa a
quale variabile (cioé di quale degli oggetti che ne hanno una) fai
riferimento.


Mancano un po di pezzi di codice nel metodo caricamento:
  public static void caricamento(){
//inizializzazione array
stazioni = new stazioni[3];
//inizializzazione elementi array
//se non inizializzi gli elementi non puoi invocare .setName();
//sugli elementi
for (int i = 0;i<3;i++) {
        stazioni[i] = new Stazioni();
}
   stazioni[0].setName("Roma");
//inizio
//questo blocco di codice puo generare problemi, perchè devi verificare di
//aver inizializzato correttamente gli elementi treni del istanza
// stazioni[0]
   stazioni[0].treni[0].setName("Treno1");
   stazioni[0].treni[1].setName("Treno2");
   stazioni[0].treni[2].setName("Treno3");
//fine
   stazioni[1].setName("Napoli");
   stazioni[2].setName("Ancona");
   stazioni[3].setName("Firenze");
   System.out.println("Nome della stazione 0 " + stazioni[0].getName());
 
  }
-- 
---------------------------------------------------
......vieni a trovarmi 
http://www.glz.it
......dai voce al tuo sito 
http://www.talkwithus.it
---------------------------------------------------

Carissimo,
condivido le osservazioni dei miei colleghi. Tuttavia l' errore di non 
istanziare gli oggetti su cui poi fai delle chiamate a metodi è ripetuto nei 
casi:
1) creazione di stazioni
2) creazione di treni
Copio, per chiarezza, le classi; vedrai l'output che attendi. Buon lavoro!
Tommaso
--------
package prova;
public class Viaggio
{
static Stazione[] stazioni;
public static void caricamento()
{
stazioni = new Stazione[4];
stazioni[0] = new Stazione();
stazioni[1] = new Stazione();
stazioni[2] = new Stazione();
stazioni[3] = new Stazione();
stazioni[0].setName("Roma");
stazioni[0].treni[0].setName("Treno1");
stazioni[0].treni[1].setName("Treno2");
stazioni[0].treni[2].setName("Treno3");
stazioni[1].setName("Napoli");
stazioni[2].setName("Ancona");
stazioni[3].setName("Firenze");
System.out.println("Nome della stazione 0 " + stazioni[0].getName());
}
public static void main(String[] args)
{ new Viaggio().caricamento(); } }
package prova;
public class Stazione
{
private String itsName;
static Treni[] treni;
public void setName(String stationName)
{
if (treni == null)
{
treni = new Treni[3];
treni[0] = new Treni();
treni[1] = new Treni();
treni[2] = new Treni();
}
itsName = stationName; }
public String getName()
{return itsName;}
}
package prova;
public class Treni
{
private String itsName;
public void setName(String aName)
{ itsName = aName; }
} 

 Voglio creare un array di classi, ma non ci riesco. Con questo codice:
Boh, a me presentarsi come "tsunami" pare fuori luogo e poco rispettoso per
il recente e ben noto episodio di morte e distruzione.
-- 
  Mangiafuoco

 il recente e ben noto episodio di morte e distruzione.
Il problema č che uso il nick da 5-6 anni, non posso cambiarlo, ormai č 
passato troppo tempo e mi ci sono affezionato. Non č assolutamente mancanza 
di rispetto, non sono cosě str***o.
Ciao 

[CUT]
Grazie a tutti per l'aiuto, ora funziona.
Ciao