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."
I a cherché une résolution dans Google et suggère que la variable n'est pas encore initalisée pour rendre les méthodes disponibles. Est-ce que j'initialise ceci incorrectement? J'ai aussi essayé de changer les choses en public mais cela n'a pas aidé non plus.
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
Non, en fait, vous devez déclarer votre champ con2 statique:
private static Java.sql.Connection con2 = null;
Edit: Correction, cela ne suffira pas, vous aurez le même problème car votre méthode getConnection2Url n’est pas non plus statique. Une meilleure solution consisterait peut-être à effectuer le changement suivant:
public static void main (String[] args) {
new testconnect().run();
}
public void run() {
con2 = Java.sql.DriverManager.getConnection(getConnectionUrl2());
}
Vous voudrez probablement ajouter "statique" à 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 bien des propriétés de l'objet (une propriété différente dans chaque objet de la même classe). ). Le mot clé "static" indique que quelque chose est une propriété de la classe.
Les choses "statiques" existent tout le temps. Les autres éléments n'existent qu'après la création d'un objet, et même dans ce cas, chaque objet individuel possède sa propre copie de l'objet. Et le revers de la médaille est la clé dans ce cas: les choses statiques ne peuvent pas accéder à des choses non-statiques, car elles ne savent pas dans quel objet regarder. Si vous lui transmettez une référence d'objet, elles peuvent faire des choses comme "thingie". .con2 ", mais dire simplement" con2 "n’est pas autorisé, car vous n’avez pas dit de quel objet con2 est destiné.
Java a deux types de variables
une)
Niveau de classe (statique):
Il y en a un par classe. Indiquez que vous avez la classe d'étudiant et que vous définisseznom comme variable statique.Maintenant, peu importe le nombre d'objets étudiant que vous créez, tous auront le même nom.
Niveau de l'objet:
Ils appartiennent à chaque objet.Si le nom est non statique, tous les étudiants peuvent avoir un nom différent.
b)
Niveau de classe:
Ces variables sont initialisées lors du chargement de la classe. Même si aucun objet étudiant n'est créé, vous pouvez toujours accéder à la variable de nom statique et l'utiliser.
Niveau de l'objet: Ils seront initialisés lorsque vous créerez un nouvel objet, par exemple avec new ();
C)
Votre problème: Votre classe vient d'être chargée dans la machine virtuelle Java et vous avez appelé sa méthode principale (statique): Légalement autorisé.
À partir de là, vous souhaitez appeler un objet varibale: Où se trouve l’objet ??
Vous devez créer un objet et vous seul pouvez accéder aux varibales au niveau objet.
Votre méthode main () est statique, mais elle référence deux membres non statiques: con2 et getConnectionUrl2 (). Vous devez faire l'une des trois choses suivantes:
1) Rendez con2 et getConnectionUrl2 () statiques.
2) Dans main (), créez une instance de la classe testconnect et accédez à con2 et à getConnectionUrl2 () en dehors de cela.
3) Découpez une classe différente pour contenir con2 et getConnectionUrl2 () afin que testconnect ne contienne que main. Il faudra quand même instancier la classe différente et appeler les méthodes.
L'option n ° 3 est la meilleure option. # 1 est le pire.
Cependant, vous ne pouvez pas accéder à des membres non statiques à partir d'une méthode statique.
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();
}
C'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 les méthodes statiques fonctionnent. Ces méthodes peuvent manipuler des données statiques, locales. les données ou les données qui lui sont envoyées en tant que paramètre. pourquoi? parce que la méthode statique peut être accédée par n’importe quel objet, à partir de n’importe où. Des problèmes de sécurité peuvent donc survenir ou des fuites d’informations s’il peut utiliser des variables d’instance. de considération.