2009-05-29 9 views
8

Poniższy kod generuje błąd dla zmiennej con2 z informacją "non-static variable con2 cannot be referenced from a static context Error." I Wyszukiwarka Google dla rozdzielczości i sugerują, że zmienna nie jest jeszcze zinternalizowana, aby uczynić metody dostępny. Czy inicjuję to niepoprawnie? Próbowałem też zmieniać rzeczy na publiczne, ale to też nie pomogło.java: Niestatyczna zmienna nie może być odwoływana ze statycznego kontekstu Błąd

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 ... pokaże, dlaczego ten problem występuje w pierwszej kolejności. – Chaitanya

Odpowiedz

10

No, rzeczywiście, trzeba zadeklarować swoje pole Con 2 statyczna:

private static java.sql.Connection con2 = null; 

Edit: Korekta, że ​​nie będzie na tyle właściwie, dostaniesz ten sam problem, ponieważ jest również metoda getConnection2Url nie jest statyczny. Lepszym rozwiązaniem może być zamiast zrobić następującą zmianę:

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

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

Twoim głównym() metoda jest statyczna, ale odwołuje się dwa non-statyczne członków: Con 2 i getConnectionUrl2(). Musisz wykonać jedną z trzech czynności:

1) Utwórz statyczne znaki con2 i getConnectionUrl2().

2) Wewnątrz funkcji main() utwórz instancję klasy testconnect i uzyskaj dostęp do con2 i getConnectionUrl2() z tego.

3) Wyróżnij inną klasę, aby zachować con2 i getConnectionUrl2(), tak aby testconnect miał tylko w sobie główną. Nadal będzie trzeba utworzyć instancję różnych klas i wyłączyć metody.

Opcja nr 3 to najlepsza opcja. # 1 jest najgorsze.

Nie można jednak uzyskać dostępu do elementów niestatycznych metodą statyczną.

13

Prawdopodobnie chcesz dodać "static" do deklaracji con2.

W języku Java rzeczy (zarówno zmienne, jak i metody) mogą być właściwościami klasy (co oznacza, że ​​są wspólne dla wszystkich obiektów tego typu) lub mogą być właściwościami obiektu (różne w każdym obiekcie tej samej klasy). Słowo kluczowe "statyczny" służy do wskazania, że ​​coś jest własnością klasy.

"Statyczny" materiał istnieje cały czas. Pozostałe rzeczy istnieją dopiero po utworzeniu obiektu, a nawet wtedy każdy pojedynczy obiekt ma swoją własną kopię rzeczy. I odwrotna strona tego jest kluczowa w tym przypadku: statyczne rzeczy nie mogą uzyskać dostępu do niestatycznych rzeczy, ponieważ nie wiedzą, do którego obiektu należy zaglądać. Jeśli przekażesz mu odnośnik do obiektu, może on zrobić takie rzeczy jak "thingie" .con2 ", ale zwykłe powiedzenie" con2 "nie jest dozwolone, ponieważ nie powiedziałeś, że con2 ma na myśli obiekt.

+0

Dobre wyjaśnienie. –

+0

Zmienne statyczne są naprawdę złym pomysłem (statyczne stałe rzeczywiste są w porządku). –

2

Najprostszą zmianą byłoby coś takiego:

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

Java ma dwa rodzaje zmiennych

a)
Class Level (statyczny):
Są jedną za Class.Say ciebie mieć klasę Student i zdefiniować imię i nazwisko jako zmienną statyczną.Teraz bez względu na to ile obiektów uczniowskich stworzysz wszystkie będą miały taką samą nazwę.

Poziom obiektu:
Należą one do obiektu.Jeśli nazwa jest niestatyczna, wówczas wszyscy uczniowie mogą mieć różne nazwy.

b)
poziomie klasy:
Te zmienne są inicjowane na klasy load.So nawet jeśli nie jest tworzony obiekt uczeń nadal można korzystać z dostępu i nazwa zmiennej statycznej.

Poziom obiektu: Zostaną zainicjowane podczas tworzenia nowego obiektu, powiedzmy, przez new();

C)
Twój problem: Twoja klasa jest po prostu załadowany JVM i nazwali swój główny sposób (statyczny): Prawnie dopuszczalne.
Teraz z tego chcesz wywołać Object varibale: Gdzie jest obiekt ??

Musisz utworzyć obiekt, a następnie tylko ty będziesz mieć dostęp do varibales poziomu obiektu.

0

Jest to interesujące pytanie, chcę tylko podać inny kąt, dodając trochę więcej informacji. Możesz zrozumieć, dlaczego wyjątek jest zgłaszany, jeśli widzisz, jak działają metody statyczne. Te metody mogą manipulować statycznymi danymi, lokalnymi danymi lub danymi wysyłanymi do niego jako parametr. Dlaczego? ponieważ metoda statyczna może być dostępna dla dowolnego obiektu z dowolnego miejsca. W związku z tym mogą pojawić się problemy związane z bezpieczeństwem lub mogą wystąpić nieszczelności informacji, jeśli można użyć zmiennych instancji. Dlatego kompilator musi rzucić taki przypadek z pominięciem.

Powiązane problemy