2009-05-29 17 views
8

Il seguente codice genera un errore sulla variabile con2 dicendo "non-static variable con2 cannot be referenced from a static context Error." I cercato su Google per una risoluzione e si suggerisce che la variabile non sia ancora inizzata per rendere i metodi a disposizione. Sto inizializzando questo in modo errato? Ho anche provato a cambiare le cose in pubblico, ma non è stato d'aiuto neanche io.java: la variabile non statica non può essere referenziata da un contesto statico Errore

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 ... mostrerà perché questo problema si verifica in primo luogo. – Chaitanya

risposta

10

No, in realtà, è necessario dichiarare il vostro campo CON2 statica:

private static java.sql.Connection con2 = null; 

Edit: Correzione, che non sarà sufficiente in realtà, si otterrà lo stesso problema, perché il metodo è anche getConnection2Url non statico. Una soluzione migliore potrebbe essere quella di fare invece la seguente modifica:

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

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

tuo metodo main() è statico, ma si fa riferimento due membri non statici: CON2 e getConnectionUrl2(). È necessario eseguire una delle tre operazioni:

1) Creare con2 e getConnectionUrl2() statici.

2) All'interno di main(), creare un'istanza di classe testconnect e accedere a con2 e getConnectionUrl2() al di fuori di esso.

3) Suddividere una classe diversa per contenere con2 e getConnectionUrl2() in modo che testconnect abbia solo main in esso. Avrà ancora bisogno di istanziare la classe diversa e chiamare fuori i metodi.

L'opzione n. 3 è l'opzione migliore. # 1 è il peggiore.

Tuttavia, non è possibile accedere a membri non statici all'interno di un metodo statico.

13

Probabilmente si desidera aggiungere "statico" alla dichiarazione di con2.

In Java, le cose (sia le variabili che i metodi) possono essere proprietà della classe (il che significa che sono condivisi da tutti gli oggetti di quel tipo), oppure possono essere proprietà dell'oggetto (una diversa in ogni oggetto della stessa classe). La parola chiave "statico" è usata per indicare che qualcosa è una proprietà della classe.

Le cose "statiche" esistono sempre. L'altra roba esiste solo dopo aver creato un oggetto, e anche allora ogni singolo oggetto ha la sua copia della cosa. E il rovescio della medaglia è la chiave in questo caso: roba statica non può accedere a cose non statiche, perché non sa quale oggetto cercare. Se le passi un riferimento ad un oggetto, può fare cose come "thingie" .con2 ", ma semplicemente dire" con2 "non è permesso, perché non hai detto quale con2 è l'oggetto.

+0

Buona spiegazione. –

+0

Le variabili statiche sono una pessima idea (le costanti reali statiche vanno bene). –

2

Il cambiamento più semplice sarebbe qualcosa di simile:

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

Java ha due tipi di variabili

a)
classe Livello (Static):
Sono uno per Class.Say voi avere Student Class e definire nome come variabile statica. Ora, indipendentemente dal numero di oggetti studente creati, tutti avranno lo stesso nome.

Livello oggetto:
Appartengono a per oggetto.Se il nome non è statico, tutti gli studenti possono avere un nome diverso.

b)
classe Livello:
Queste variabili vengono inizializzati su Class load.So anche se non viene creato alcun oggetto studente è comunque possibile accedere e utilizzare variabili nome statico.

Livello oggetto: Vengono inizializzati quando si crea un nuovo oggetto, ad esempio new();

C)
il problema: La classe è appena caricato in JVM e di aver chiamato il suo metodo main (statico): legalmente consentito.

Ora da quello che vuoi chiamare un oggetto varibale: dov'è l'oggetto ??

Devi creare un oggetto e solo tu puoi accedere a varibales a livello di oggetto.

0

Questa è una domanda interessante, voglio solo dare un'altra angolazione aggiungendo qualche informazione in più. Puoi capire perché viene lanciata un'eccezione se vedi come funzionano i metodi statici. Questi metodi possono manipolare dati statici, dati locali o dati che vengono inviati come parametro. Perché? perché il metodo statico è accessibile da qualsiasi oggetto, da qualsiasi luogo. Quindi, ci possono essere problemi di sicurezza o possono esserci perdite di informazioni se può usare variabili di istanza. Quindi il compilatore deve prendere in considerazione un caso del genere.

Problemi correlati