2009-05-29 5 views
8

Der folgende Code einen Fehler generiert auf die Variable con2"non-static variable con2 cannot be referenced from a static context Error." sagen referenziert werden ich für eine Auflösung gegoogelt und sie schlagen vor, die Variable noch nicht ist, initialisiert die Methoden zu machen verfügbar. Initialisiere ich das falsch? Ich habe auch versucht, Dinge öffentlich zu machen, aber das hat auch nicht geholfen.java: nicht-statische Variable kann nicht von einem statischen Kontext Fehler

private static java.sql.Connection con2 = null; 

Edit::

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 ... es wird zeigen, warum dieses Problem in erster Linie auftritt. – Chaitanya

Antwort

10

Nein, eigentlich, müssen Sie Ihr con2 Feld statisch deklarieren Korrektur, die tatsächlich nicht ausreichen wird, werden Sie das gleiche Problem bekommen, weil Ihre getConnection2Url Methode auch ist nicht statisch. Eine bessere Lösung kann sein, stattdessen die folgende Änderung zu tun:

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

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

Ihre Methode main() statisch ist, aber es verweist auf zwei nicht-statische Member: con2 und getConnectionUrl2(). Sie müssen eines von drei Dingen tun:

1) Make con2 und getConnectionUrl2() statisch.

2) Innerhalb main(), erstellen Sie eine Instanz der Klasse testconnect und Zugriff con2 und getConnectionUrl2() davon.

3) Brechen Sie eine andere Klasse aus, um con2 und getConnectionUrl2() zu speichern, damit testconnect nur main enthält. Es muss immer noch die andere Klasse instanziieren und die Methoden davon aufrufen.

Option # 3 ist die beste Option. # 1 ist das Schlimmste.

Sie können jedoch nicht innerhalb einer statischen Methode auf nicht statische Elemente zugreifen.

13

Wahrscheinlich möchten Sie der Deklaration von con2 "statisch" hinzufügen.

In Java können Dinge (sowohl Variablen als auch Methoden) Eigenschaften der Klasse sein (was bedeutet, dass sie von allen Objekten dieses Typs gemeinsam genutzt werden), oder sie können Eigenschaften des Objekts sein (eine andere in jedem Objekt) der gleichen Klasse). Das Schlüsselwort "static" wird verwendet, um anzuzeigen, dass etwas eine Eigenschaft der Klasse ist.

"Static" Sachen gibt es die ganze Zeit. Die anderen Sachen existieren nur, nachdem Sie ein Objekt erstellt haben, und selbst dann hat jedes einzelne Objekt seine eigene Kopie der Sache. Und die Kehrseite davon ist in diesem Fall der Schlüssel: Statische Sachen können nicht auf nicht-statische Sachen zugreifen, weil sie nicht wissen, in welches Objekt sie hineinschauen sollen. Wenn Sie eine Objektreferenz übergeben, kann sie Sachen wie "Ding" machen .con2 ", aber einfach" con2 "zu sagen ist nicht erlaubt, weil Sie nicht gesagt haben, welches Objekt con2 gemeint ist. so etwas wie dieses

+0

Gute Erklärung. –

+0

Statische Variablen sind eine wirklich schlechte Idee (statische reelle Konstanten sind in Ordnung). –

2

wäre die einfachste Veränderung:

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

Java hat zwei Arten von Variablen

a)
Klassenstufe (statisch):
Sie eine pro Class.Say sind Sie haben Student Class und definiert Name als statische Variable.Nun egal wie viele Studenten Objekt Sie erstellen alle haben den gleichen Namen.

Objektlevel:
Sie gehören zu jedem Objekt.Wenn der Name nicht statisch ist, können alle Schüler einen anderen Namen haben.

b)
Klasse Level:
werden Diese Variablen auf Klasse load.So initialisiert, auch wenn kein Student Objekt Sie noch und statische Namen Variable zugreifen können erstellt.

Objekt-Ebene: Sie werden initialisiert, wenn Sie ein neues Objekt erstellen, zB new();

C)
Ihr Problem: Ihre Klasse ist nur in JVM geladen und Sie haben ihr Haupt (statisch) Methode aufgerufen: Gesetzlich erlaubt.

Jetzt von dem Sie ein Objekt varibale aufrufen möchten: Wo ist das Objekt ??

Sie müssen ein Objekt erstellen und nur Sie können auf Variablen auf Objektebene zugreifen.

0

Dies ist eine interessante Frage, ich möchte nur einen weiteren Blickwinkel geben, indem Sie ein wenig mehr Info hinzufügen. Sie können verstehen, warum eine Ausnahme ausgelöst wird, wenn Sie sehen, wie statische Methoden funktionieren. Diese Methoden können entweder statische Daten, lokale Daten oder Daten, die als Parameter an sie gesendet werden, manipulieren. weil auf die statische Methode von jedem beliebigen Objekt aus zugegriffen werden kann. Es kann also zu Sicherheitsproblemen kommen, oder es kann zu Datenlecks kommen, wenn es Instanzvariablen verwenden kann. Daher muss der Compiler einen solchen Fall außer Acht lassen.

Verwandte Themen