2009-05-29 137 views
8

下面的代碼在變量con2上生成一個錯誤,說"non-static variable con2 cannot be referenced from a static context Error."我谷歌搜索的一個解決方案,他們建議該變量尚未initalized尚未使方法可用。我是否正確初始化?我也嘗試將事情變爲公開,但這也沒有幫助。java:非靜態變量不能從靜態上下文中引用錯誤

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 ...它會顯示爲什麼這個問題首先發生。 – Chaitanya 2013-01-30 09:45:37

回答

10

不,實際上,你必須聲明你的CON2現場靜:

private static java.sql.Connection con2 = null; 

編輯:校正,這是不夠的實際,你會得到同樣的問題,因爲你的getConnection2Url方法也不是靜態的。一個更好的解決方案可能是,而不是做如下修改:

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

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

你的main()方法是靜態的,但它引用兩個非靜態成員:CON2和getConnectionUrl2()。你需要做三件事之一:

1)使con2和getConnectionUrl2()靜態。

2)在main()內部,創建類testconnect的一個實例,並且訪問con2和getConnectionUrl2()。

3)打破一個不同的類來保存con2和getConnectionUrl2(),以便testconnect只有它的主要內容。它仍然需要實例化不同的類並調用這些方法。

選項#3是最佳選擇。 #1是最差的。

但是,您不能從靜態方法中訪問非靜態成員。

13

您可能想要將「static」添加到con2的聲明中。在Java中,事物(包括變量和方法)可以是類的屬性(這意味着它們被該類型的所有對象共享),或者它們可以是對象的屬性(每個對象中的不同對象)同班同學)。關鍵字「靜態」用於表示某些東西是該類的屬性。

「靜態」東西一直存在。其他的東西只有在你創建了一個對象之後才存在,即使這樣每個單獨的對象都有它自己的東西副本。在這種情況下,這是關鍵:靜態內容不能訪問非靜態內容,因爲它不知道要查看哪個對象。如果您將對象引用傳遞給它,它可以執行諸如「thingie .con2「,但只是說」con2「是不允許的,因爲你沒有說過哪個對象的con2是指。

+0

很好的解釋。 – 2009-05-31 18:41:32

2

最簡單的變化將是這樣的:

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

Java有兩種變量

一)
職業等級(靜態):
他們每Class.Say你一個有學生類,並將名稱定義爲靜態變量。現在無論您創建多少個學生對象都具有相同的名稱。

物體等級:
它們屬於每個物體。如果名稱不是靜態的,則所有學生都可以有不同的名稱。

B)
職業等級:
該變量在類load.So初始化即使沒有創建學生對象,你仍然可以訪問和使用靜態名稱變量。

對象等級: 當你創建一個新的對象,比如說new(),它們會被初始化。

C)
您的問題: 你的類只是裝入JVM和你調用它的主(靜態)方法:法律允許。

現在你想調用一個對象varibale:對象在哪裏?

您必須創建一個對象,然後只有您可以訪問對象級別的varibales。

0

這是一個有趣的問題,我只是想通過添加更多信息來給出另一個角度。如果您看到靜態方法的運行方式,您可以理解爲什麼會引發異常。 這些方法可以處理靜態數據,本地數據或作爲參數發送給它的數據。爲什麼?因爲任何對象都可以從任何地方訪問靜態方法。 因此,如果可以使用實例變量,則可能存在安全問題或可能泄漏信息。因此,編譯器不得不拋出這種情況。

相關問題