2009-05-29 5 views
8

Le code suivant génère une erreur sur la variable con2 en disant "non-static variable con2 cannot be referenced from a static context Error." J'ai recherché une résolution et ils suggèrent que la variable n'est pas encore initialisée pour rendre les méthodes disponible. Est-ce que je l'initialise incorrectement? J'ai aussi essayé de changer les choses en public mais cela n'a pas aidé non plus.java: variable non statique ne peut pas être référencée à partir d'un contexte statique Erreur

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 ... il montrera pourquoi ce problème se produit en premier lieu. – Chaitanya

Répondre

10

Non, en fait, vous devez déclarer votre champ CON2 statique:

private static java.sql.Connection con2 = null; 

Edit: Correction, qui ne sera pas fait assez, vous obtiendrez le même problème parce que votre méthode de getConnection2Url est également pas statique. Une meilleure solution est peut-être à la place faire le changement suivant:

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

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

Votre principale méthode() est statique, mais il fait référence à deux membres non statiques: CON2 et getConnectionUrl2(). Vous devez effectuer l'une des trois opérations suivantes:

1) Static2 et getConnectionUrl2() statiques.

2) À l'intérieur de main(), créez une instance de classe testconnect et accédez à con2 et getConnectionUrl2() à partir de cela.

3) Sortez une classe différente pour contenir con2 et getConnectionUrl2() de sorte que testconnect ne contienne que main. Il faudra encore instancier la classe différente et appeler les méthodes.

L'option # 3 est la meilleure option. # 1 est le pire. Mais, vous ne pouvez pas accéder aux membres non statiques à partir d'une méthode statique.

13

Vous souhaitez probablement ajouter "static" à la déclaration de con2. En Java, les choses (variables et méthodes) peuvent être des propriétés de la classe (ce qui signifie qu'elles sont partagées par tous les objets de ce type), ou peuvent être des propriétés de l'objet (une différente dans chaque objet) de la même classe). Le mot clé "statique" est utilisé pour indiquer que quelque chose est une propriété de la classe.

Des trucs "statiques" existent tout le temps. L'autre substance existe seulement après que vous avez créé un objet, et même alors chaque objet individuel a sa propre copie de la chose. Et le revers de la médaille est la clé dans ce cas: les éléments statiques ne peuvent pas accéder à des éléments non statiques, car ils ne savent pas quel objet regarder. Si vous lui passez une référence d'objet, il peut faire des trucs comme "thingie". .con2 ", mais simplement dire" con2 "n'est pas autorisé, parce que vous n'avez pas dit quel est le con2 de l'objet.

+0

Bonne explication. –

+0

Les variables statiques sont une très mauvaise idée (les constantes réelles statiques sont correctes). –

2

Le changement le plus simple serait quelque chose comme ceci:

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

Java a deux types de variables

a)
classe de niveau (statique):
Ils sont l'un par Class.Say vous avoir classe d'étudiants et défini nom comme variable statique.Maintenant, peu importe combien d'objet étudiant que vous créez tous auront le même nom.

Niveau objet:
Ils appartiennent à par Objet.Si le nom n'est pas statique, tous les étudiants peuvent avoir un nom différent.

b) Classe
Niveau:
Ces variables sont initialisés de classe load.So même si aucun objet étudiant est créé, vous pouvez toujours accéder et utiliser la variable nom statique.

Niveau de l'objet: Ils seront initialisés lorsque vous créez un nouvel objet, par exemple new();

C)
Votre problème: Votre classe est simplement chargée dans JVM et que vous avez appelé la principale méthode (statique): légalement autorisé.

Maintenant, à partir de ce que vous voulez appeler un objet varibale: Où est l'objet ??

Vous devez créer un objet, puis vous pouvez uniquement accéder aux varibales au niveau de l'objet.

0

Ceci est une question intéressante, je veux juste donner un autre angle en ajoutant un peu plus d'informations. Vous pouvez comprendre pourquoi une exception est levée si vous voyez comment fonctionnent les méthodes statiques. Ces méthodes peuvent manipuler des données statiques, des données locales ou des données qui lui sont envoyées en tant que paramètre. Pourquoi? parce que la méthode statique peut être accessible par n'importe quel objet, de n'importe où. Ainsi, il peut y avoir des problèmes de sécurité posés ou il peut y avoir des fuites d'informations s'il peut utiliser des variables d'instance. Par conséquent, le compilateur doit jeter un tel cas hors de considération.

Questions connexes