Per capire tutti quegli errori in compilazione ti dev'essere chiara la distinzione tra variabili/metodi statici (o di classe)e variabili/metodi di istanza (o non statici),trovi molta documentazione online e cartacea, questo è un punto cruciale della programmazione a oggetti quindi dai un'occhiata.
Ti faccio un po' di esempi per chiarire i tipi di errore che puoi fare se non sai bene quando usare variabili/metodi statici e quando no:
codice:
public class ProvaThis
{
int campo=3;
public static void main(String[] args)
{
}
public static int getCampo()
{
return this.campo;
}
}
In questo esempio l'errore è nel metodo getCampo(): il metodo è definito come statico, quindi è un metodo di classe e deve essere richiamato sulla classe a cui appartiene.Invece la scrittura return this.campo sta dicendo di ritornare la variabile campo propria dell'istanza su cui viene richiamato il metodo.Questo produce il seguente errore in compilazione:
ProvaThis.java:10: error: non-static variable this cannot be referenced from a static context
return this.campo;
^
Se tu definisci il metodo getCampo() come non statico quindi: public int getCampo(), il programma compila.
Una volta che il metodo è definito come metodo d'istanza però ,deve essere richiamato su un'istanza della tua classe e non sulla classe stessa.Questo è l'errore che faccio nel seguente esempio:
codice:
public class ProvaThis
{
int campo=3;
public static void main(String[] args)
{
int provaCampo=getCampo();
}
public int getCampo()
{
return this.campo;
}
}
La scrittura int provaCampo=getCampo(); ,equivale a scrivere int provaCampo=ProvaThis.getCampo(); cioè il metodo getCampo lo stai implicitamente richiamando sulla classe ProvaThis e non su un'istanza della classe.Quindi avrai il seguente errore in compilazione:
ProvaThis.java:6: error: non-static method getCampo() cannot be referenced from a static context
int provaCampo=getCampo();
^
Per correggere questo errore puoi quindi istanziare un oggetto della tua classe e richiamare il metodo su quell'istanza, ad esempio:
codice:
ProvaThis p=new ProvaThis();
int provaCampo=p.getCampo();
Sostituendo la riga 6 con queste due righe non avrai più problemi in compilazione.
Ha senso quindi chiedersi se ha senso definire metodi/ variabili come statici oppure no.
Questo dipende da molte cose, ma a mio parere istanziare un oggetto solo per richiamarci sopra un metodo (come faresti nel tuo caso istanziando un oggetto della classe ReadFileee solo per evitare l'errore in compilazione)non ha molto senso, quindi tanto vale dichiarare tutto come statico, anche se non è molto elegante e va un po' contro alla logica di programmazione ad oggetti.
Se però decidi di usare i metodi statici non basta togliere il this. dai tuoi metodi, ad esempio se compili questo codice avrai ancora un errore in compilazione:
codice:
public class ProvaThis
{
int campo=3;
public static void main(String[] args)
{
}
public static int getCampo()
{
return campo;
}
}
ProvaThis.java:9: error: non-static variable campo cannot be referenced from a static context
return campo;
^
In questo caso l'errore è nella riga return campo; , anche in questo caso scrivere campo corrisponde a scrivere ProvaThis.campo, quindi stai usando campo come variabile di classe ma l'hai definita come variabile d'istanza.
Quindi risolvi l'errore definendo static int campo=3.
Per tornare al tuo codice se vuoi usare tutti i metodi statici , togli tutti i this. dai vari return e definisci le variabili come statiche,oppure definisci i metodi togliendo lo static e poi nel main (e in qualsiasi altro metodo) quando usi il metodo lo richiami su un'istanza della tua classe.