PDA

View Full Version : [Java] istruzione If sembra non funzionare


Oscar@
11-10-2010, 09:35
salve a tutti,
ho un problemino con l' istruzione if di java..

nella visualizzazione dei dati volevo far apparire nel campo relativo la scritta "Si" o "NO" invece di" true" o "false" , in base al valore letto da un metodo che ritorna un valore di tipo boolean..
riporto qui un pezzo del codice:



//creazione JLabel//

if( miacamera[f].GetBagno()==true)
{JLabel etichetta6=new JLabel("SI");}
else
{JLabel etichetta6=new JLabel("NO");}

......


Mframe.getContentPane().add(etichetta5);
Mframe.getContentPane().add(etichetta6);

........

Ecco all riga :Mframe.getContentPane().add(etichetta6)
mi riporta l errore : etichetta6 cannot be resolved

da notare che le altre JLabel vengono correttamente create e visualizzate nella finestra, però sembra che non gli piaccia l istruzione IF ( che peraltro non riporta errori di sintassi ecc.)

grazie mille!

astorcas
11-10-2010, 09:48
salve a tutti,
ho un problemino con l' istruzione if di java..

nella visualizzazione dei dati volevo far apparire nel campo relativo la scritta "Si" o "NO" invece di" true" o "false" , in base al valore letto da un metodo che ritorna un valore di tipo boolean..
riporto qui un pezzo del codice:



//creazione JLabel//

if( miacamera[f].GetBagno()==true)
{JLabel etichetta6=new JLabel("SI");}
else
{JLabel etichetta6=new JLabel("NO");}

......


Mframe.getContentPane().add(etichetta5);
Mframe.getContentPane().add(etichetta6);

........

Ecco all riga :Mframe.getContentPane().add(etichetta6)
mi riporta l errore : etichetta6 cannot be resolved

da notare che le altre JLabel vengono correttamente create e visualizzate nella finestra, però sembra che non gli piaccia l istruzione IF ( che peraltro non riporta errori di sintassi ecc.)

grazie mille!

Non hai ben chiaro il concetto di scope di una variabile. Non è l'if il problema. Come vedi hai dichiarato etichetta6 all'interno dell'if (fra le {}) e quindi la variabile "muore" lì. Se scrivessi una cosa tipo:


JLabel etichetta6=null;
if( miacamera[f].GetBagno()==true)
{etichetta6=new JLabel("SI");}
else
{etichetta6=new JLabel("NO");}

la variabile etichetta6 avrebbe uno scope più ampio che non è limitato all'interno dell'if. Quindi nella chiamata


Mframe.getContentPane().add(etichetta6);


la tua etichetta rimarrebbe visibile.

Ti consiglio di fare una ricerca sullo scope delle varibili, o scoping

ndakota
11-10-2010, 13:49
Non hai ben chiaro il concetto di scope di una variabile. Non è l'if il problema. Come vedi hai dichiarato etichetta6 all'interno dell'if (fra le {}) e quindi la variabile "muore" lì. Se scrivessi una cosa tipo:


JLabel etichetta6=null;
if( miacamera[f].GetBagno()==true)
{etichetta6=new JLabel("SI");}
else
{etichetta6=new JLabel("NO");}

la variabile etichetta6 avrebbe uno scope più ampio che non è limitato all'interno dell'if. Quindi nella chiamata


Mframe.getContentPane().add(etichetta6);


la tua etichetta rimarrebbe visibile.

Ti consiglio di fare una ricerca sullo scope delle varibili, o scoping

Scoping :oink: Sì sì, fai una ricerchina :sofico:

astorcas
11-10-2010, 13:59
Scoping :oink: Sì sì, fai una ricerchina :sofico:

ecco lo sapevo che dovevo risparmiare le ultime 2 parole :rolleyes:



:asd:

Oscar@
11-10-2010, 15:33
Non hai ben chiaro il concetto di scope di una variabile. Non è l'if il problema. Come vedi hai dichiarato etichetta6 all'interno dell'if (fra le {}) e quindi la variabile "muore" lì. Se scrivessi una cosa tipo:


JLabel etichetta6=null;
if( miacamera[f].GetBagno()==true)
{etichetta6=new JLabel("SI");}
else
{etichetta6=new JLabel("NO");}

la variabile etichetta6 avrebbe uno scope più ampio che non è limitato all'interno dell'if. Quindi nella chiamata


Mframe.getContentPane().add(etichetta6);


la tua etichetta rimarrebbe visibile.

Ti consiglio di fare una ricerca sullo scope delle varibili, o scoping


ok ti ringrazio molto.. ho provato e cosi funziona!
non riesco solo a capire come mai non accetti la sintassi completa(errore riportato-> duplicate local variable) :

...
JLabel etichetta6=null;
if( miacamera[f].GetBagno()==true)
{JLabel etichetta6=new JLabel("SI");}
else
{JLabel etichetta6=new JLabel("NO");}
....

ma solo quella abbreviata come da te suggerito

nell ' if :
if( miacamera[f].GetBagno()==true)
{etichetta6=new JLabel("SI");}
else
{etichetta6=new JLabel("NO");}

astorcas
11-10-2010, 15:48
non ho abbreviato niente, ho permesso alla variabile di avere una "vita più lunga" :asd:

cmq cerco di fartti capire con un po' di pseudocodice e commenti.
Innanzitutto sappi che una variabile esiste nello scope in cui è stata creata e in tutti gli scope "figli" (nell'esempio quelli 2 e 3)

ESEMPIO 1


public void Metodo(){ //scope 1

JLabel label=null; //dichiarata una variabile che essendo stata creata nello scope 1 durerà fino alla fine di tale scope;

if(qualcosa){ //scope 2
label = new JLabel("SI");
} //fine scope 2
else{//scope 3
label = new JLabel("NO");
}//fine scope 3

panel.add(label); //siamo in scope 1, quindi la variabile label esiste ancora)

} //Fine scope 1 (da qui in poi non esiste più label)




ESEMPIO 2


public void Metodo(){ //scope 1

if(qualcosa){ //scope 2
JLabel label = new JLabel("SI"); //la variabile label nasce in scope 2 e muore alla fine di scope 2
} //fine scope 2
else{//scope 3
JLabel label = new JLabel("NO"); //la variabile label nasce in scope 3 e muore alla fine di scope 3 (e tra l'altro non ha niente a che fare con la precedente)
}//fine scope 3

panel.add(label); //siamo fuori da scope 2 o 3 e non esiste nessuna variabile label definita nello scope corrente)

} //Fine scope 1



Chiaro? O ancora più confuso?

Oscar@
11-10-2010, 16:00
non ho abbreviato niente, ho permesso alla variabile di avere una "vita più lunga" :asd:

cmq cerco di fartti capire con un po' di pseudocodice e commenti.
Innanzitutto sappi che una variabile esiste nello scope in cui è stata creata e in tutti gli scope "figli" (nell'esempio quelli 2 e 3)

ESEMPIO 1


public void Metodo(){ //scope 1

JLabel label=null; //dichiarata una variabile che essendo stata creata nello scope 1 durerà fino alla fine di tale scope;

if(qualcosa){ //scope 2
label = new JLabel("SI");
} //fine scope 2
else{//scope 3
label = new JLabel("NO");
}//fine scope 3

panel.add(label); //siamo in scope 1, quindi la variabile label esiste ancora)

} //Fine scope 1 (da qui in poi non esiste più label)




ESEMPIO 2


public void Metodo(){ //scope 1

if(qualcosa){ //scope 2
JLabel label = new JLabel("SI"); //la variabile label nasce in scope 2 e muore alla fine di scope 2
} //fine scope 2
else{//scope 3
JLabel label = new JLabel("NO"); //la variabile label nasce in scope 3 e muore alla fine di scope 3 (e tra l'altro non ha niente a che fare con la precedente)
}//fine scope 3

panel.add(label); //siamo fuori da scope 2 o 3 e non esiste nessuna variabile label definita nello scope corrente)

} //Fine scope 1



Chiaro? O ancora più confuso?


CHiaro.. il concetto di scope mi è ora + chiaro ..grazie
era solo la sintassi nel if dell istruzione :
{etichetta6=new JLabel("SI");}
invece di
{JLabel etichetta6=new JLabel("SI");}

ma forse ho capito... la variabile viene dichiarata fuori dell if
con : JLabel etichetta6=null;
e viene poi istanziata all interno dell if, senza JLabel davanti a etichetta6.


porta pazienza sono un po alle prime armi... :)