2009-05-29 20 views
8

निम्न कोड con2 पर एक त्रुटि उत्पन्न कर रहा है "non-static variable con2 cannot be referenced from a static context Error." मैं एक संकल्प के लिए Googled और वे सुझाव दे रहे हैं कि वेरिएबल अभी तक तरीकों को बनाने के लिए initalized नहीं है उपलब्ध। क्या मैं इसे गलत तरीके से शुरू कर रहा हूं? मैंने चीजों को जनता में बदलने की भी कोशिश की लेकिन इससे कोई मदद नहीं मिली।जावा: गैर स्थैतिक चर को एक स्थिर संदर्भ से संदर्भित नहीं किया जा सकता है त्रुटि

private static java.sql.Connection con2 = null; 

संपादित करें::

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

उत्तर

10

नहीं है, वास्तव में, आप अपने con2 क्षेत्र स्थिर घोषित करना चाहिए सुधार, कि वास्तव में पर्याप्त नहीं होगा, तो आप एक ही समस्या मिल जाएगा क्योंकि आपके 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 बनाएं और कनेक्शन कनेक्शन Ur2() स्थिर करें।

2) मुख्य() के अंदर, कक्षा टेस्टकनेक्ट का एक उदाहरण बनाएं और con2 तक पहुंचें और getConnectionUrl2() को बंद करें।

3) con2 को पकड़ने के लिए एक अलग वर्ग को तोड़ें और getConnectionUrl2() प्राप्त करें ताकि परीक्षण कनेक्ट में केवल मुख्य हो। इसे अभी भी अलग-अलग वर्ग को तुरंत चालू करने और उस तरीके से कॉल करने की आवश्यकता होगी।

विकल्प # 3 सबसे अच्छा विकल्प है। # 1 सबसे खराब है।

लेकिन, आप स्थैतिक विधि से गैर स्थैतिक सदस्यों तक नहीं पहुंच सकते हैं।

13

आप शायद con2 की घोषणा के लिए "स्थैतिक" जोड़ना चाहते हैं।

जावा में, चीजें (दोनों चर और विधियां) कक्षा के गुण हो सकती हैं (जिसका अर्थ है कि वे उस प्रकार की सभी वस्तुओं द्वारा साझा किए जाते हैं), या वे ऑब्जेक्ट के गुण हो सकते हैं (प्रत्येक ऑब्जेक्ट में एक अलग एक ही कक्षा के)। कीवर्ड "स्थैतिक" का उपयोग यह इंगित करने के लिए किया जाता है कि कुछ कक्षा की संपत्ति है।

"स्टेटिक" सामान हर समय मौजूद है। अन्य सामान केवल एक ऑब्जेक्ट बनाने के बाद ही मौजूद है, और फिर भी प्रत्येक ऑब्जेक्ट की चीज़ की अपनी प्रतिलिपि होती है। और इस मामले में इसका फ्लिप पक्ष महत्वपूर्ण है: स्थैतिक सामान गैर स्थैतिक सामान तक नहीं पहुंच सकते हैं, क्योंकि यह नहीं जानता कि कौन सी वस्तु को देखना है। यदि आप इसे ऑब्जेक्ट संदर्भ पास करते हैं, तो यह "चीज़ी" जैसी चीजें कर सकता है .con2 ", लेकिन बस" con2 "कहने की अनुमति नहीं है, क्योंकि आपने यह नहीं कहा है कि किस ऑब्जेक्ट का con2 का मतलब है।

+0

अच्छी व्याख्या। –

+0

स्टेटिक चर एक बहुत ही बुरा विचार हैं (स्थिर असली स्थिरांक ठीक हैं)। –

2

सरल परिवर्तन कुछ इस तरह होगा:

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

जावा चर

के दो प्रकार के

क)
कक्षा स्तर (स्टेटिक):
वे Class.Say आप प्रति एक हैं छात्र वर्ग है और नाम स्थिर चर के रूप में परिभाषित किया गया है.अब कोई फर्क नहीं पड़ता कि आप कितने छात्र वस्तु बनाते हैं, वही नाम होगा।

ऑब्जेक्ट लेवल:
वे प्रति ऑब्जेक्ट से संबंधित हैं।यदि नाम गैर स्थैतिक है, तो सभी छात्र के पास अलग-अलग नाम हो सकते हैं।

ख)
कक्षा स्तर:
यह चर वर्ग load.So पर प्रारंभ कर रहे हैं कोई छात्र वस्तु आप अभी भी पहुँच सकते हैं और स्थिर नाम चर का उपयोग कर सकते हैं बनाई गई है, भले ही।

वस्तु स्तर: वे प्रारंभ हो जाएगी जब आप एक नई वस्तु बनाने, नए से कहते हैं कि();

सी)
आपका समस्या: आपका वर्ग बस JVM में भरी हुई है और आप अपने मुख्य (स्थिर) विधि कहा जाता है: कानूनी तौर पर अनुमति दी।

अब से है कि आप एक वस्तु varibale कॉल करना चाहते हैं: वस्तु कहां है ??

आप एक वस्तु बनाने के लिए और उसके बाद ही आप ऑब्जेक्ट स्तर varibales पहुँच सकते हैं।

0

यह एक दिलचस्प सवाल है, मैं सिर्फ एक छोटे से अधिक info.You समझ सकते हैं अगर आप देखते हैं कि कैसे स्थिर तरीकों संचालित क्यों एक अपवाद फेंक दिया है जोड़कर एक अन्य कोण देना चाहते हैं। ये विधियां या तो स्थिर डेटा, स्थानीय डेटा या डेटा को पैरामीटर के रूप में भेजे गए डेटा में हेरफेर कर सकती हैं। क्यों? क्योंकि किसी भी वस्तु से कहीं भी स्थैतिक विधि तक पहुंचा जा सकता है। तो, वहाँ सुरक्षा के मुद्दों उत्पन्न हो सकता है या वहाँ जानकारी के लीक हो सकता है अगर यह ध्यान से बाहर इस तरह के मामले फेंकने के लिए उदाहरण variables.Hence संकलक है उपयोग कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे