# non-static variable con cannot be referenced from a static context



## nieselfriem (10. Apr 2010)

Hallo!

Ich versuche mir eine kleine Connectionklasse für MYSQL in java zu schreiben.
diese sieht wie folgt aus

```
import java.sql.*;
public class MySQLConnect {
   
   private String dbmysqldrv="com.mysql.jdbc.Driver";
   private String dbmysqlurl="jdbc:mysql://localhost:3306/test";
   private String dbmysqlusr="root";
   private String dbmysqlpw="password";
   
   private String dbiniterrorstr="";
   private String connecterrorstr="";
   private String sqlexcstr="";
   private String sqlwarnstr="";
   
   
   public boolean initDatabaseDriver(){
      try {
         Class.forName(dbmysqldrv);
	     return true;	
      }//try
      catch(Exception e) {
         dbiniterrorstr= (dbiniterrorstr+"\n--- Fehler bei der Treiberregistrierung ---\n");
  	     dbiniterrorstr=(dbiniterrorstr+e.getMessage());
	     e.printStackTrace();
		return false;
      }//catch
   }//initDatabaseDriver
   
   public Connection connectDataBase() {
      Connection con = null;
	  try {
	     con =DriverManager.getConnection(dbmysqlurl,dbmysqlusr,dbmysqlpw); 
  	  }//try
	  catch(SQLException e) {
	  connecterrorstr=(connecterrorstr+"\n--- Fehler bei der Treiberregistrierung ---\n");
	  connecterrorstr=(connecterrorstr+e);
	  }//catch
	  catch(Exception e) {
	     connecterrorstr=(connecterrorstr+"\n--- Fehler bei der Treiberregistrierung ---\n");
		 connecterrorstr=(connecterrorstr+e);
	  }//catch
	  return con;
   }//connectDataBase
   
   public String getDBinitError() {
      return dbiniterrorstr;
   }
   
   public String getConnectError() {
      return connecterrorstr;
   }
}//class
```
diese Klasse soll nun zu Testzwecken in einer kleine Select-Anwendung ausgeführt bzw. verwendet werden.

```
import java.sql.*;

public class Select2 {
   
   MySQLConnect mysqlcon = new MySQLConnect();
     
  
   private Statement stmt = null;
   private ResultSet rs = null;
   
     boolean  initdrv=mysqlcon.initDatabaseDriver();
     Connection con=mysqlcon.connectDataBase();
   
   public static void main(String[] argv) {
      if (!initdrv) {
         System.out.println(mysqlcon.getDBinitError());
      }
            
      if(!con) {
         System.out.println(mysqlcon.getConnectError());  
      }
      try {
	    System.out.println("Verbindung zu DB ok\nDatenbank aus der Datenbank holen...");
		stmt = con.createStatement();
		rs = stmt.executeQuery("SELECT * FROM mitarbeiter");
		System.out.println("gelesene Ergebnisse:");
		while(rs.next()) {
		   String nummer = rs.getString(1);
		   String name = rs.getString(2);
		   String vorname = rs.getString(3);
		   System.out.println("Nummer="+nummer);
		   System.out.println("Name="+name);	
		   System.out.println("Vorname="+vorname);	
		 }//while
		 rs.close();
		 stmt.close();
		 con.close();
	 }//try
     catch(SQLException e) {
	    System.out.println(e.getMessage);
     }//catch
   }//main
  }//class
```
Jedoch bekomme ich da folgende Probleme

```
Select2.java:15: non-static variable initdrv cannot be referenced from a static context
      if (!initdrv) {
           ^
Select2.java:16: non-static variable mysqlcon cannot be referenced from a static context
         System.out.println(mysqlcon.getDBinitError());
                            ^
Select2.java:19: non-static variable con cannot be referenced from a static context
... und weitere, die auf die obigen Probleme aufbauen
```
Ich habe doch keine statischen Methoden in der MySQLConnect-Klasse verwendet oder gelten die Variablen als static?
Eine Erklärung währe sehr hilfreich, ich steh da gerade echt auf dem Schlauch

Gruß niesel


----------



## Schumi (10. Apr 2010)

main ist static und Deine Klassenvariablen nicht. Das genau wird ja auch angemerkt.


----------



## agentone (10. Apr 2010)

> private String dbini*terror*str="";
> private String connec*terror*str="";


Als ich das das erste mal gelesen habe, dachte ich, du willst Kontakt zu Taliban aufnehmen.


----------



## icarus2 (10. Apr 2010)

Mach mal Select2 s = new Select2() oder sowas. Dann hast du ein Objekt und kannst entweder den ganzen Code aus der Main in den Konstruktor nehmen, oder du rufst die Instanzvariablen über den Objektnamen auf.


----------



## nieselfriem (10. Apr 2010)

"main ist static und Deine Klassenvariablen nicht. Das genau wird ja auch angemerkt. "

Das versteh ich nicht. ich muß doch auch in der main. Instanzen eines Objetes erzeuigen und verwenden können, was nicht static ist.
Aber ich habe gelesen, dass die Methoden getConnection() und forName() wohl stic Methoden sind. Währe möglich, dass es daran liegt.


----------



## eRaaaa (10. Apr 2010)

nieselfriem hat gesagt.:


> "main ist static und Deine Klassenvariablen nicht. Das genau wird ja auch angemerkt. "
> 
> Das versteh ich nicht. ich muß doch auch in der main. Instanzen eines Objetes erzeuigen und verwenden können, was nicht static ist.
> Aber ich habe gelesen, dass die Methoden getConnection() und forName() wohl stic Methoden sind. Währe möglich, dass es daran liegt.



In der Fehlermeldung steht doch genau woran es liegt?
--> initdrv  = nicht static = du kannst sie nicht aus einer statischen Methoden wie die Main verwerden!(außer du erstellst wie schon angesprochen ein Objekt || du machst sie eben statisch ;>)

http://www.java-forum.org/stichwort...ic-method-cant-referenced-static-context.html


----------



## nieselfriem (10. Apr 2010)

ich habs. habe nur folgendes gemacht. Habe das Objekt    

```
MySQLConnect mysqlcon = new MySQLConnect
```
in der main erzeugen lassen, auch irgendwie logisch in java. Dann habe ich die Variablen rs und, stmt als static mittels

```
private static  Statement stmt = null;
private static ResultSet rs = null;
```

umgeschrieben, und siehe da es geht. Danke für eure Tipps!


----------



## Landei (10. Apr 2010)

So geht es natürlich auch. Um das Problem in der ursprünglichen Form zu lösen: initdrv und so sind bei dir eine Instanzvariable, du greifst aber aus einem statischen Kontext (sozusagen "der Klasse selbst") darauf zu.

Entweder du machst alle Variablen in Select2 statisch:


```
static MySQLConnect mysqlcon = new MySQLConnect();
...usw.
```

oder du erzeugst in main eine _Instanz_ von Select2:


```
public static void main(String[] argv) {
      Select2 inst = new Select2();
      if (!inst.initdrv) {
         System.out.println(mysqlcon.getDBinitError());
      }
     ...
```

Oder du holst als dritte Variante alle Variablen in die Methode selbst, wie von dir beschrieben. Dann stehen sie aber nach Beendigung der Methode nicht mehr zur Verfügung (was aber bei main kein Problem sein sollte).


----------

