Java - Error: non-static variable this cannot be referenced from a static context

 
Vista:
Imágen de perfil de Roberto
Val: 14
Ha aumentado su posición en 330 puestos en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Roberto (5 intervenciones) el 27/10/2020 09:26:06
Hola.

Para empezar os pido disculpas por éste nuevo mensaje. Estoy empezando en el mundo de Java, llevo algún que otro programilla, pero los últimos tres con el mismo error en el código, y no logro entender el motivo.

Rogaría no solo solución, sino una expicación de porque me ocurre. Y ya os digo, no me lipidéis, que no entiendo nada de Java y los inicios me están resultando abrumadores.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//Importamos las clases UTIL para Scanner y MATH para PI y POW
import java.util.*;
import java.lang.math.*;         //error: unused import
import java.text.*;
 
//Creamos la clase circunferencia con los atributos indicados
public class Circuenferencia {
    double teclado;
    double radio;
    double diametro;
    double area;
    double longitud;
 
    /**
     * @param args the command line arguments
     */
 
    //Creamos el método MAIN
    public static void main(String[] args) {
        // TODO code application logic here
 
        //Pedimos por teclado el valor del radio
        System.out.println("Introduzca el valor del radio de la circunferencia: ");
 
        //creamos el objeto teclado de la clase Scanner que recibe el dato del usuario
        Scanner teclado = new Scanner(System.in);
 
        //cogemos el valor dado por teclado y lo redirigimos a la variable radio
        radio = teclado.nextDouble();      //Error: non-static variable this cannot be referenced from a static context
 
        //Calculamos el DIÄMETRO, y la LONGITUD de la circunferencia y el ÁREA del círculo
        diametro = 2 * radio;             //Error: non-static variable this cannot be referenced from a static context
        longitud = 2 * math.PI * radio;                //Error: non-static variable this cannot be referenced from a static context
        area = math.PI * math.pow(radio,2);       //Error: non-static variable this cannot be referenced from a static context
 
        //Formateamos las variables para que muestre dos decimales
        DecimalFormat formato = new DecimalFormat("#.00");
 
        //Imprimimos en pantalla los datos de los cálculos anteriores
        System.out.println("Para un radio de: " + formato.format(radio) + ", tenemos las siguientes operaciones y resultados:");   //Error: non-static variable this cannot be referenced from a static context
        System.out.println("El diámetro de la circunferencia es de: " + formato.format(diametro));         //Error: non-static variable this cannot be referenced from a static context
        System.out.println("La longitud de la circunferencia es de: " + formato.format(longitud));       //Error: non-static variable this cannot be referenced from a static context
        System.out.println("El área del círculo comprendeido dentro de la circunferencia es de: " + formato.format(area));    //Error: non-static variable this cannot be referenced from a static context
 
 
    }

En éste otro código, tengo el mismo error:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//importamos la clase util para tener acceso a la clase Scanner
import java.util.*;
 
//Creamos la clase pública "TextoTeclado"
public class TextoTeclado {
 
    //Tendrá los siguientes atributos
    String textoT;
    int vocales = 0;
    int consonantes;
    int espacios = 0;
    int longitud;
 
    String TextoT = new String();
 
    /**
     * @param args the command line arguments
     */
 
    //Creamos el método MAIN
    public static void main(String[] args) {
        // TODO code application logic here
 
        //Creamos el objeto "textoteclado" de la clase Scanner
        Scanner textoteclado = new Scanner(System.in);
 
        //Pedimos por consola la introdución de un texto
        System.out.println("Por favor, si es tan amable, escriba un texto: ");
 
        //Capturamos el texto indtroducido y lo reasignamos a la variable "textoT"
        textoT = textoteclado.nextLine();        //Error: non-static variable this cannot be referenced from a static context
 
        //Creamos un array de tipo char con el texto introducido
        char[] textocaracter = textoT.toCharArray();   //Error: non-static variable this cannot be referenced from a static context
 
        /* Averiguamos el número de caracteres y la clase de los mismos */
 
        //Creamos la variable del bucle for
        int i;
 
        //Contamos el número de caracteres del texto introducido por pantalla y lo asiganmos a la variable longitud
        longitud = textocaracter.length;      //Error: non-static variable this cannot be referenced from a static context
 
        //Creamos el bucle for
        for(i=0;i<longitud;i++)          //Error: non-static variable this cannot be referenced from a static context
        {
            //Hacemos un condicionante para comprobar si dentro del array de tipo char, hay caracteres que coincidan con lo indicados (a,e,i,o,u)
            if(textocaracter[i]=='a' || textocaracter[i]=='e' || textocaracter[i]=='i' || textocaracter[i]=='o' || textocaracter[i]=='u')
            {
                //cada vez que encuentra una de las vocales le suma 1 a la variable vocales
                vocales++;         //Error: non-static variable this cannot be referenced from a static context
            }
 
            if (textocaracter[i]==' ')
            {
                //cada ve que encuentra une espacio en blanco, le suma 1 a la variable espacios
                espacios++;         //Error: non-static variable this cannot be referenced from a static context
            }
        }
 
        //para obtener el número de consonantes, a la longitud total del texto introducido por pantalla, le restamos las vocales y los espacios
        consonantes=longitud-vocales-espacios;   //Error: non-static variable this cannot be referenced from a static context
 
        //imprimimos por pantalla todos los datos obtenidos con las operaciones anteriores
        System.out.println("El texto introducido es: " + textoT);     //Error: non-static variable this cannot be referenced from a static context
        System.out.println("Tiene " + longitud + " caracteres");      //Error: non-static variable this cannot be referenced from a static context
 
        System.out.println("El numero de vocales son: " + vocales);       //Error: non-static variable this cannot be referenced from a static context
        System.out.println("El numero de consonantes son: " + consonantes);    //Error: non-static variable this cannot be referenced from a static context
        System.out.println("El numero de espacios son: " + espacios);    //Error: non-static variable this cannot be referenced from a static context
 
    }
}

Alguien me puede comentar algo al respecto ?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error: non-static variable this cannot be referenced from a static context

Publicado por Tom (1646 intervenciones) el 27/10/2020 09:34:10
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto
Val: 14
Ha aumentado su posición en 330 puestos en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Roberto (5 intervenciones) el 27/10/2020 09:56:47
Gracias por el cosejo Tom, te aseguro que lo sigo al pie de la letra

Aunque todo lo que tenga que ver con Inglés, como que me queda muy por encima de mis posibilidades cuando se ha estudiado toda la vida francés.

En cuánto a las lecturas, estoy haciendo el ciclo de DAM.

Terminé éste año ASIR, y con las convalidaciones, me encuentro haciendo los módulos de segundo sin haber hecho los de primero, y tengo que leer tantos PDFs, que al pretender hacerlo con el tiempo justo de llegar a los exámenes, me estoy volviendo loco, aunque supongo que no sea la excepción y tú mismo lo hayas podido hacer sin problema. Lamentablemente no es mi caso, mi mente no da para más.

Así que aquí estoy, preguntando.

Un saludo y muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto
Val: 14
Ha aumentado su posición en 330 puestos en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Roberto (5 intervenciones) el 27/10/2020 09:49:05
Al código de la clase circunferencia me respondo yo mismo, ya está solucionado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//Importamos las clases UTIL para Scanner y MATH para PI y POW
import java.util.*;
import java.lang.Math.*;
import java.text.*;
 
//Creamos la clase circunferencia con los atributos indicados
public class Circuenferencia {
    /*double teclado;
    double radio;
    double diametro;
    double area;
    double longitud;*/
 
    /**
     * @param args the command line arguments
     */
 
    //Creamos el método MAIN
    public static void main(String[] args) {
        // TODO code application logic here
 
        double radio;
        double diametro;
        double area;
        double longitud;
 
        //Pedimos por teclado el valor del radio
        System.out.println("Introduzca el valor del radio de la circunferencia: ");
 
        //creamos el objeto teclado de la clase Scanner que recibe el dato del usuario
        Scanner teclado = new Scanner(System.in);
 
        //cogemos el valor dado por teclado y lo redirigimos a la variable radio
        radio = teclado.nextDouble();
 
        //Calculamos el DIÄMETRO, y la LONGITUD de la circunferencia y el ÁREA del círculo
        diametro = 2 * radio;
        longitud = 2 * Math.PI * radio;
        area = Math.PI * Math.pow(radio,2);
 
        //Formateamos las variables para que muestre dos decimales
        DecimalFormat formato = new DecimalFormat("#.00");
 
        //Imprimimos en pantalla los datos de los cálculos anteriores
        System.out.println("Para un radio de: " + formato.format(radio) + ", tenemos las siguientes operaciones y resultados:");
        System.out.println("El diámetro de la circunferencia es de: " + formato.format(diametro));
        System.out.println("La longitud de la circunferencia es de: " + formato.format(longitud));
        System.out.println("El área del círculo comprendeido dentro de la circunferencia es de: " + formato.format(area));
 
    }
}

Para empezar tenía escrito mal la referencia a la clase Math
Había declarado la variable teclado que utilizo en la clase Scanner

Sigo pegándome con TextoTeclado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto
Val: 14
Ha aumentado su posición en 330 puestos en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Roberto (5 intervenciones) el 27/10/2020 10:19:18
Pues me vuelvo a auto responder
Después de mirar y mirar y buscar y buscar, encontré la solución en google

Me ha pasado por declarar las variables fuera del método MAIN

una vez declaradas dentro, se han resuelto todos los errores

siento haber realizado ésta pregunta, siempre se ha dicho, que quien no sabe es como quien no ve, e intenta solventar la duda de la forma más rápida posible y con el menor esfuerzo.

Se puede borrar el tema ?

un saludo y muchas gracias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//importamos la clase util para tener acceso a la clase Scanner
import java.util.*;
 
//Creamos la clase pública "TextoTeclado"
public class TextoTeclado {
 
    /*//Tendrá los siguientes atributos
    String textoT;
    int vocales = 0;
    int consonantes;
    int espacios = 0;
    int longitud;
 
    String TextoT = new String();*/
 
    /**
     * @param args the command line arguments
     */
 
    //Creamos el método MAIN
    public static void main(String[] args) {
        // TODO code application logic here
 
        //Tendrá los siguientes atributos
        String textoT;
        int vocales = 0;
        int consonantes;
        int espacios = 0;
        int longitud;
        int signos=0;
 
        String TextoT = new String();
 
        //Creamos el objeto "textoteclado" de la clase Scanner
        Scanner textoteclado = new Scanner(System.in);
 
        //Pedimos por consola la introdución de un texto
        System.out.println("Por favor, si es tan amable, escriba un texto: ");
 
        //Capturamos el texto indtroducido y lo reasignamos a la variable "textoT"
        textoT = textoteclado.nextLine();
 
        //Creamos un array de tipo char con el texto introducido
        char[] textocaracter = textoT.toCharArray();
 
        /* Averiguamos el número de caracteres y la clase de los mismos */
 
        //Creamos la variable del bucle for
        int i;
 
        //Contamos el número de caracteres del texto introducido por pantalla y lo asiganmos a la variable longitud
        longitud = textocaracter.length;
 
        //Creamos el bucle for
        for(i=0;i<longitud;i++)
        {
            //Hacemos un condicionante para comprobar si dentro del array de tipo char, hay caracteres que coincidan con lo indicados (a,e,i,o,u)
            if(textocaracter[i]=='a' || textocaracter[i]=='á' || textocaracter[i]=='e' || textocaracter[i]=='é' || textocaracter[i]=='i' || textocaracter[i]=='í' || textocaracter[i]=='o' || textocaracter[i]=='ó' || textocaracter[i]=='u' || textocaracter[i]=='ú')
            {
                //cada vez que encuentra una de las vocales le suma 1 a la variable vocales
                vocales++;
            }
 
            if (textocaracter[i]==' ')
            {
                //cada ve que encuentra une espacio en blanco, le suma 1 a la variable espacios
                espacios++;
            }
 
            if (textocaracter[i]==',' || textocaracter[i]=='.' || textocaracter[i]==':' || textocaracter[i]==';' )
            {
                //cada ve que encuentra une espacio en blanco, le suma 1 a la variable espacios
                signos++;
            }
 
        }
 
        //para obtener el número de consonantes, a la longitud total del texto introducido por pantalla, le restamos las vocales y los espacios
        consonantes=longitud-vocales-signos-espacios;
 
        //imprimimos por pantalla todos los datos obtenidos con las operaciones anteriores
        System.out.println("El texto introducido es: " + textoT);
        System.out.println("Tiene " + longitud + " caracteres");
 
        System.out.println("El numero de vocales son: " + vocales);
        System.out.println("El numero de consonantes son: " + consonantes);
        System.out.println("El numero de signos de puntuación son: " + signos);
        System.out.println("El numero de espacios son: " + espacios);
 
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.809
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Kabuto (740 intervenciones) el 27/10/2020 12:24:51
Hola Roberto.

Todo viene a causa de la palabra reservada static, que no suele explicarse por qué se usa en algunas partes (el método main() siempre lo lleva) y en otras no, no se explica que implica usarla o no, que diferencia supone, etc...


Previamente, hay que tener clara la diferencia entre clase y objeto.
Una clase define las propiedades (atributos, variables, métodos...) que tendrá un objeto que pertenezca a dicha clase.
Un objeto, es ya una entidad propia y distinta de los demás objetos de su misma clase, creados según lo establecido por su clase.

Por ejemplo, Roberto y Kabuto, es decir, tú y yo... somos objetos únicos de la clase Persona.
Tenemos dos ojos con ciertos colores, una nariz, boca, extremidades, peso, edad, nombre, color de piel, etc...porque todas las Personas tenemos esas características.
Pero incluso aunque coincidiéramos en color de piel, peso, edad, color ojos, nombre, fecha nacimiento....seguiríamos siendo dos objetos distintos, de una misma clase sí, pero distintos.
Cada uno somos una entidad propia.

Bueno, eso en cuanto a diferenciar entre clase y objeto, que no se si aclarado algo o lo he liado más xDDD

Por otra parte, las clases en Java tienen dos contextos: estático y no estático.

La principal diferencia es que los métodos y variables declarados en contexto estático (static) pertenecen a la clase en sí, y no al objeto que esta clase pueda crear.
Por eso el método main() es estático.

Tu clase se llama TextoTeclado, y para que el método main() funcione, no necesitas crear un objeto de esta clase, es decir, en ningún momento necesitas hacer un new TextoTeclado ()

En cambio, todo lo que se declare dentro de la clase sin aplicarle el atributo static, implica que estará en un contexto "no estático". Es decir, estos datos que van a pertenecer al objeto.
Y será necesario crear un objeto para acceder a estos datos.

Y eso es lo que pasaba en tu código.

Las variables que pusiste fuera del main, están en un contexto "no estático".
Pero el main, está en contexto estático, por tanto, no puede acceder a esas variables.
De ahí el error:
non-static variable this cannot be referenced from a static context
Variable "no estática" no puede ser referenciada desde un contexto estático

Dichas variables "no estáticas" solo podrían ser accesibles para el main si creases un objeto de la clase TextoTeclado
Por ejemplo:
1
2
3
TextoTeclado  tt = new TextoTeclado ();
//Capturamos el texto indtroducido y lo reasignamos a la variable "textoT"
tt.textoT = textoteclado.nextLine();

Y podría ser una solución válida.
De hecho, sería ideal en el caso de que quisieras trabajar con varios textos al mismo tiempo
1
2
3
4
5
6
7
8
9
10
11
12
TextoTeclado  tt1 = new TextoTeclado ();
TextoTeclado  tt2 = new TextoTeclado ();
TextoTeclado  tt3 = new TextoTeclado ();
TextoTeclado  tt4 = new TextoTeclado ();
//Capturamos 1er texto
tt1.textoT = textoteclado.nextLine();
//Capturamos 2do texto
tt2.textoT = textoteclado.nextLine();
//Capturamos 3er texto
tt3.textoT = textoteclado.nextLine();
//Capturamos 4to texto
tt4.textoT = textoteclado.nextLine();


En tu caso solo quieres trabajar con un texto, así que no es necesario crear objetos.
Pero entonces tienes que hacer que esas variables pase al contexto estático, para que el main pueda acceder y trabajar con ellas.

Tienes dos opciones para esto:
La primera, lo que has hecho, declarar las variables dentro del main. Como el main es estático, todo lo que se construya dentro de él también lo será. Así que problema solucionado.

La segunda, declarar las variables fuera del main, pero con el atributo static:
1
2
3
4
5
6
7
8
9
//Creamos la clase pública "TextoTeclado"
public class TextoTeclado {
 
    /*//Tendrá los siguientes atributos
    static String textoT;
    static int vocales = 0;
    static int consonantes;
    static int espacios = 0;
    static int longitud;

De este modo, las variables se encuentran dentro del contexto estático y el método main o cualquier otro método que también sea static, podrá acceder a ellas sin problemas.


No se si me he explicado bien, pero si buscas por la red sobre esto, encontrarás más explicaciones sobre la directiva static.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto
Val: 14
Ha aumentado su posición en 330 puestos en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Roberto (5 intervenciones) el 27/10/2020 13:59:16
Vaya, muchísimas gracias Kabuto.

Empecé éste ciclo porque los profesores en su día, me dijeron que con la facilidad que había tenido para sacar ASIR, que no tendría problemas con éste, que además ya había dado programación (HTML, CSS, PHP). ¡¡¡ Pero si no tiene nada que ver !!!

Empiezan el curso con retraso, la primera clase telemática la gastan en la presentación de cada módulo, está todo patas arriba, no les funciona bien el micro, no se defienden con soltura con Teams. Empezamos ésta semana con la segunda clase de cada módulo, y ya nos informan de que el primer examen será el 23 de noviembre de Servicios y Procesos, de segundo.

Cabe destacar que lo estoy cursando en la modalidad de distancia, y solo tenemos tres clases por cada módulo.

Al venir de ASIR, me convalidan 6, por lo que he cogido las 7 restantes. Pero meterme en segundo sin programación de primero me resulta practicamente impoisible.

Para mi, vuestra lógica de programación, no tiene ninguna lógica.

y así estoy, pegándome como puedo con ésta barbaridad de contenidos que me está desbordando.

Así que lo dicho, muchísimas gracias por tus explicaciones. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.809
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Error: non-static variable this cannot be referenced from a static context

Publicado por Kabuto (740 intervenciones) el 28/10/2020 00:07:27
Sí, la programación web respecto a la "programación general" tiene sus diferencias.
Lo que hayas aprendido de PHP y/o JavaScript, puede ser de ayuda para cosas básicas: bucles, asignación de variables, evaluar expresiones... pero no dejan de ser "mundos distintos".

Por otra parte, todo esto del contexto estático y "no estático", a todos nos trajo de cabeza al principio. Y puede que mi explicación te sirva para arrojar algo de luz, pero ya verás como lo entenderás mucho mejor cuando avances más en programación POO.
Entonces sí que te resultará lógico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar