2009-05-29 13 views
8

El siguiente código está generando un error en la variable con2 diciendo busqué una resolución y están sugiriendo que la variable no está activada aún para hacer los métodos disponible. ¿Estoy inicializando esto incorrectamente? También traté de cambiar las cosas a público, pero eso tampoco ayudó.java: no se puede hacer referencia a la variable no estática desde un contexto estático Error

import java.io.*; 
import java.net.*; 

import java.sql.*; 
import java.sql.CallableStatement; 
import java.sql.ResultSet; 
import java.sql.PreparedStatement; 
import net.sourceforge.jtds.jdbcx.JtdsDataSource; 
import net.sourceforge.jtds.jdbc.Driver; 

class testconnect { 

    private java.sql.Connection con2 = null; 

    private final String url2 = "jdbc:jtds:sqlserver://"; 
    private final String serverName= "SQL01"; 
    private final String portNumber = "2677"; 
    private final String databaseName= "App"; 
    private final String userName = "bob"; 
    private final String password = "boob"; 
    private final String selectMethod = "cursor"; 

    private String getConnectionUrl2(){ 
     System.out.println("initalizing jtds"); 
      //String returnVal = url+serverName+":"+portNumber+";databaseName="+databaseName+";user="+userName+";password="+password+";instance="+instance+";"; 
      String returnVal = url2+serverName+":"+portNumber+"/"+databaseName+";user="+userName+";password="+password; 
      System.out.println("url2: " + returnVal); 
      return returnVal; 
    } 

    public static void main (String[] args) { 
     con2 = java.sql.DriverManager.getConnection(getConnectionUrl2()); 

    } 

} //end class 
+0

http://javarevisited.blogspot.in/2012/02/why-non-static-variable-cannot-be.html ... se mostrará por qué ocurre este problema en primer lugar. – Chaitanya

Respuesta

10

No, de hecho, debe declarar su campo con2 estática:

private static java.sql.Connection con2 = null; 

Editar: Corrección, que no será suficiente en realidad, obtendrá el mismo problema debido a que su método es también getConnection2Url no estático Una mejor solución puede ser la de hacer en su lugar el siguiente cambio:

public static void main (String[] args) { 
    new testconnect().run(); 
} 

public void run() { 
    con2 = java.sql.DriverManager.getConnection(getConnectionUrl2()); 
} 
5

Su método main() es estática, sino que hace referencia a dos miembros no estáticos: CON2 y getConnectionUrl2(). Debe hacer una de estas tres cosas:

1) Hacer que con2 y getConnectionUrl2() estén estáticos.

2) Dentro de main(), cree una instancia de clase testconnect y acceda a con2 y getConnectionUrl2() fuera de eso.

3) Rompe una clase diferente para contener con2 y getConnectionUrl2() para que testconnect solo tenga main en ella. Todavía necesitará crear una instancia de la clase diferente y llamar a los métodos de eso.

La opción n. ° 3 es la mejor opción. # 1 es el peor.

Pero no puede acceder a miembros no estáticos desde un método estático.

13

Probablemente desee agregar "estático" a la declaración de con2.

En Java, las cosas (tanto variables como métodos) pueden ser propiedades de la clase (lo que significa que son compartidas por todos los objetos de ese tipo), o pueden ser propiedades del objeto (una diferente en cada objeto de la misma clase). La palabra clave "estática" se usa para indicar que algo es una propiedad de la clase.

"Estático" cosas existen todo el tiempo. Las otras cosas solo existen después de haber creado un objeto, e incluso entonces cada objeto individual tiene su propia copia del objeto. Y la otra cara de esto es clave en este caso: las cosas estáticas no pueden acceder a cosas no estáticas, porque no sabe en qué objeto mirar. Si le pasa una referencia de objeto, puede hacer cosas como "cosa" .con2 ", pero simplemente diciendo" con2 "no está permitido, porque no has dicho a qué objeto se refiere con2.

+0

Buena explicación. –

+0

Las variables estáticas son una muy mala idea (las constantes estáticas reales son buenas). –

2

El cambio más simple sería algo como esto:

public static void main (String[] args) throws Exception { 
    testconnect obj = new testconnect(); 
    obj.con2 = DriverManager.getConnection(obj.getConnectionUrl2()); 
    obj.con2.close(); 
} 
6

Java tiene dos tipos de variables

a)
Clase Nivel (estático):
Son uno por Class.Say se tener clase de estudiante y se ha definido con el nombre como variable estática. Ahora, independientemente de la cantidad de objetos de alumno que cree, todos tendrán el mismo nombre.

Nivel del objeto:
Ellos pertenecen a per Object.Si el nombre no es estático, todos los estudiantes pueden tener un nombre diferente.

b)
Nivel Clase:
Estas variables se inicializan en la Clase load.So incluso si no se crea un objeto estudiante todavía se puede acceder y utilizar la variable nombre estático.

Nivel del objeto: Se inicializarán al crear un objeto nuevo, digamos por nuevo();

C)
su problema: Su clase se acaba de cargar en JVM y que han llamado a su método principal (estática): legalmente permitido.

Ahora desde el que desea llamar a un objeto varibale: ¿Dónde está el objeto?

Tienes que crear un objeto y solo entonces puedes acceder a los varibales del nivel de objeto.

0

Esta es una pregunta interesante, solo quiero dar otro ángulo agregando un poco más de información. Puede entender por qué se lanza una excepción si ve cómo funcionan los métodos estáticos. Estos métodos pueden manipular datos estáticos, datos locales o datos que se le envían como parámetro. ¿Por qué? porque cualquier objeto puede acceder al método estático desde cualquier lugar. Por lo tanto, puede haber problemas de seguridad o puede haber filtraciones de información si puede usar variables de instancia. Por lo tanto, el compilador tiene que descartar ese caso.

Cuestiones relacionadas