PDA

Visualizza la versione completa : [java] perchè nn funziona questo codice?


gogetassj4dp
16-06-2004, 19:42
premetto che il codice è stupido e mi serve solo per capire come mai nn riesco a compilare classi separate. mi potreste aiutare?
secondo voi perchè mi da errore sulla compilazione di questo codice?


public class prova{
class Ciao{
private String x;
public Ciao(){
x="ciao";
}

public String toString(){
return x;
}

}

public static void main(String[] args){
c=new Ciao();
System.out.println(c);
}
private Ciao c;
}

l'errore che mi dà è il seguente: non-static variable c cannot be referenced from a static context
c=new Ciao();

scusate ma cosa vuol dire? ho provato anche a disinstallare e reinstallare la jvm ma nn funziona ugualmente! perchè??

Lethalman
16-06-2004, 21:31
Perchè la classe Ciao si trova dentro prova :D
Quindi ho fai new prova.Ciao oppure togli fuori la classe Ciao da prova

gogetassj4dp
16-06-2004, 22:14
il problema è che se metto le due classi in file diversi mi dà lo stesso errore! nn riesco a capire perchè!! :dhò: precisamene mi dà l'errore "cannot resolve symbol". Ma perchè mi dà errore se la classe Ciao è dentro la stessa cartella? e questo nn me lo fa solo con questa classe, ma con tutte le classi strutturate in questo modo!

edit: se le metto nello stesso file me le compila, però mi dà questo errore: "Exception in thread main java.lang.NoClassDefFoundError: prova"
perchè diavolo mi dice questa cosa? ho anche provato a disinstallare e reinstallare la jvm ma nn succede niente!

Angelo1974
16-06-2004, 22:37
Se vuoi usare l'esempio da te fatto devi fare:


public class prova{

class Ciao{

private String x;
public Ciao(){

x="ciao";
}

public String toString(){
return x;
}
}

public static void main(String[] args){

Ciao c = new prova().new Ciao();
System.out.println(c);
}
}

Sinceramente non riesco a capire che errore ti dia se li metti in 2 file differenti.
Ciao

gogetassj4dp
16-06-2004, 22:40
ho fatto così però mi dà l'errore che ho messo prima! nn riesco a capire nemmeno io perchè mi dice questa cosa! ora controllo l'errore che mi dà se lo metto in file diversi e poi ti dico.

edit: ecco quello che mi dice

cannot resolve symbol
symbol : class Ciao
location: class prova
Ciao c=new Ciao();

le classi sono organizzate in questo modo

public class prova{


public static void main(String[] args){
Ciao c=new Ciao();
System.out.println(c);



}

}


public class Ciao{
private String x;
public Ciao(){
x="ciao";
}

public String toString(){
return x;
}

}

vorrei riuscire a capire, nn voglio arrivare a reinstallare il so per qualche strano motivo!
grazie a tutti!!

Angelo1974
17-06-2004, 00:07
Ho provato il codice separato in due file e usando JBuilder va tutto ok; se, invece utilizzo una shell dos digitando:

javac Ciao.java la compilazione è ok
javac prova.java ho gli stessi errori che hai tu

se però faccio:

javac *.java va tutto ok
tra l'altro se lancio l'applicativo con
java prova
ho un errore che non ho mai visto, spero che qulcuno me lo spieghi; allego l'immagine della mia shell dos

Lucis
17-06-2004, 12:03
@ gogetassj4dp

io lo scriverei così:


public class prova {
public static void main(String[] args){
c=new Ciao();
System.out.println(c);
}
private static Ciao c;
}

class Ciao {
private String x;
public Ciao(){
x="ciao";
}

public String toString(){
return x;
}
}
ti dà quell'errore perchè hai dichiarato la variabile c "non static" e quindi rappresenta lo stato di un oggetto istanziato. Non può essere usata, quindi, da un metodo statico come main. Sarebbe come scrivere una classe tipo


public class Uomo {
private int altezza;

public Uomo(int a) {
altezza = a;
}

public static void main(String[] args) {
Uomo u1 = new Uomo(180);
Uomo u2 = new Uomo(170);

//System.out.println(altezza);
}
}
la linea commentata non compila perchè cosa si vuole stampare? L'altezza di u1 o di u2?
Se invece dichiari static la variabile altezza allora la consideri come variabile di classe, ovvero indipendente dall'istanza.

@ Angelo1974

mai visto un errore simile, ma non riesco a leggerlo bene (l'immagine è troppo piccola)...

:ciauz:

Lethalman
17-06-2004, 14:59
Ciao c=new Ciao();

non

c=new Ciao();

Almeno penso sia questo il problema, bisogna specificare il tipo di variabile.

gogetassj4dp
17-06-2004, 15:29
Originariamente inviato da Lucis
@ gogetassj4dp

io lo scriverei così:


public class prova {
public static void main(String[] args){
c=new Ciao();
System.out.println(c);
}
private static Ciao c;
}

class Ciao {
private String x;
public Ciao(){
x="ciao";
}

public String toString(){
return x;
}
}
ti dà quell'errore perchè hai dichiarato la variabile c "non static" e quindi rappresenta lo stato di un oggetto istanziato. Non può essere usata, quindi, da un metodo statico come main. Sarebbe come scrivere una classe tipo


public class Uomo {
private int altezza;

public Uomo(int a) {
altezza = a;
}

public static void main(String[] args) {
Uomo u1 = new Uomo(180);
Uomo u2 = new Uomo(170);

//System.out.println(altezza);
}
}
la linea commentata non compila perchè cosa si vuole stampare? L'altezza di u1 o di u2?
Se invece dichiari static la variabile altezza allora la consideri come variabile di classe, ovvero indipendente dall'istanza.

@ Angelo1974

mai visto un errore simile, ma non riesco a leggerlo bene (l'immagine è troppo piccola)...

:ciauz:

nn capisco perchè dovrei dichiare una variabile in quel modo dato che fino ad oggi è sempre andata! nn riesco proprio a capire! cmq io ho scritto nel main Ciao c=new Ciao() e cmq se chiamo System.out.println(c) dovrebbe richiare il medoto toString, io nn ho scritto di stampare un campo dell'oggetto Ciao come può essere x che è una variabile privata

LeleFT
17-06-2004, 15:57
A me funziona perfettamente. Ho i due file separati prova.java e Ciao.java in una cartella. Entro nella cartella dal prompt dei comandi. Digito javac *.java e la compilazione va a buon fine. Lancio il programma prova attraverso il comando java e ottengo il seguente output:


D:\Ciao>java prova
ciao

Il problema nel primo programma da te postato era dovuto al fatto che dichiaravi una variabile globale (un oggetto d'istanza) e tentavi di istanziarlo in un contesto statico: il main. All'interno dei contesti statici (come il main) si possono istanziare e usare solo oggetti statici o locali all'ambiente statico.


Ciao. :ciauz:

Loading