Você está na página 1de 4

Qu significa el mensaje de error non-static method

<nombre> cannot be referenced from a static context?

El problema radica en comprender el significado de static. Los elementos (atributos o


mtodos) declarados como estticos mediante el modificador static se pueden
entender como elementos que le pertenecen a la clase y no a la instancia de la clase.
En otras palabras, los elementos estticos son globales para la clase que est
cargada en memoria. Aqu un ejemplo de uso de un mtodo esttico:
public class UnaClase {
public static void log(String mensaje) {
System.out.println("[LOG] " + mensaje);
}
public void logNoEstatico(String mensaje) {
System.out.println("[LOG no estatico] " + mensaje);
}
}

public class ClasePrincipal {


public static void main(String[] args) {
UnaClase unaClase = new UnaClase();
unaClase.log("hola mundo"); //llamando a mtodo esttico desde instancia, es vlido
UnaClase.log("hola mundo"); //llamando a mtodo esttico directamente desde la clase, es vlido porque
el mtodo esttico le "pertenece" a la clase y no a las instancias

unaClase.logNoEstatico("hola mundo"); //llamando a mtodo no esttico desde instancia, es vlido


//UnaClase.logNoEstatico("hola mundo"); //no se puede llamar al mtodo no esttico directamente desde
la clase, no es vlido
}
}
Como estos elementos pertenecen a la clase y no a la instancia, no se pueden utilizar
elementos de la instancia para trabajar con elementos estticos. Qu significa esto?
Que un atributo o mtodo no esttico no se puede llamar desde un mtodo esttico.
Revisemos el mtodo:
//el mtodo limpiaCadena es esttico, no necesita ninguna instancia
//de la clase para ser utilizado
public static String limpiaCadena(String s) {
s = (s == null) ? "" : s.trim();
//el mtodo hazAlgo no es esttico, entonces necesita
//que se llame desde una instancia de la clase
//como no existe una instancia aqu,
//el compilador muestra el mensaje de error correspondiente
hazAlgo(s);
}

Cmo resolver el problema?

La solucin ms simple es no utilizar atributos ni mtodos no estticos directamente


dentro de mtodos estticos. Esto simplemente es un error. Si tienes una situacin
donde "necesitas" llamar a un atributo o mtodo no esttico dentro de un mtodo
esttico, te voy adelantando que ests cometiendo un grave error de diseo.
Advertencia puesta.
Una solucin "sencilla" es cambiar el mtodo no esttico a esttico, pero debes
comprender el significado del cambio (si no entiendes el significado, vuelve a leer
desde el inicio de la respuesta).

Existen alternativas a este problema:

1. Crea la instancia de la clase dentro del mtodo esttico:

2. public static String limpiaCadena(String s) {


3. s = (s == null) ? "" : s.trim();
4. new Clase().hazAlgo(s);
}
Solo utiliza esto si es que la clase no mantiene estado. De todas formas, este es un diseo
extrao y no recomendado.
5. Declara la clase como argumento del mtodo esttico:

6. public static String limpiaCadena(String s, Clase instancia) {


7. s = (s == null) ? "" : s.trim();
8. instancia.hazAlgo(s);
}
Esta es una mejor alternativa, ms limpia en diseo pero necesitars ms cdigo.

JOptionPane handling ok, cancel and x button

The basic approach for this can look like I've showed below:
1down vote accepted

Updated after @MadProgrammer comment.


import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class DemoJOption {


public static void main(String args[]) {
int n = JOptionPane.showOptionDialog(new JFrame(), "Message",
"Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
null, new Object[] {"Yes", "No"}, JOptionPane.YES_OPTION);

if (n == JOptionPane.YES_OPTION) {
System.out.println("Yes");
} else if (n == JOptionPane.NO_OPTION) {
System.out.println("No");
} else if (n == JOptionPane.CLOSED_OPTION) {
System.out.println("Closed by hitting the cross");
}
}
}
public static void main(final String[] args) {
int value = 0;
while (true) {
try {
value = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter value?", null));

if (value <= 0) {
System.out.println("value cannot be 0 or negative");
} else {
System.out.println("value is positive");
break;
}
} catch (NumberFormatException e) {
System.out.println("*** Please enter an integer ***");
}
}
}

How to handle cancel button in JOptionPane


For example:
20down vote accepted

int n = JOptionPane.showConfirmDialog(
frame, "Would you like green eggs and ham?",
"An Inane Question",
JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) {

} else if (n == JOptionPane.NO_OPTION) {

} else {

}
Alternatively with showOptionDialog:
Object[] options = {"Yes, please", "No way!"};
int n = JOptionPane.showOptionDialog(frame,
"Would you like green eggs and ham?",
"A Silly Question",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
if (n == JOptionPane.YES_OPTION) {

} else if (n == JOptionPane.NO_OPTION) {

} else {

}
EDIT: showInputDialog
String response = JOptionPane.showInputDialog(owner, "Input:", "");
if ((response != null) && (response.length() > 0)) {

Você também pode gostar