2009-09-02 12 views
21

तो मैं लाइन से लाइन के माध्यम से कदम, ग्रहण में एक जावा/jboss आवेदन डीबगिंग (दूरस्थ रूप से) हूँ। एक बिंदु पर, GridSquare ऑब्जेक्ट की श्रृंखला यानी (GridSquare एक काफी सरल, स्टैंडअलोन वर्ग, है कुछ गुण और विधियों में शामिल है) एक विधि कॉल द्वारा बनाई गई है,:डीबगिंग करते समय मैं ClassNotLoadedException से कैसे निपटूं?

GridSquare[] squares = this.theGrid.getSquares(14, 18, 220, 222);

... जबकि जब मैं वास्तव में कोड निष्पादित करें, squares सरणी GridSquare ऑब्जेक्ट्स के साथ पॉप्युलेट हो जाती है, कोड और डिबगिंग के माध्यम से कदम उठाने पर मुझे कुछ अजीब लगता है।

org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.

... किसी को भी पता है कि उस के बारे में बताया गया है: एक मूल्य के तुरंत बाद काम ऊपर दिखाए गए, अगर मैं squares सरणी को देखने का प्रयास लाइन पर एक ब्रेकपाइंट, बजाय मैं इस मिल सकता है?

उत्तर

20

असल में इसका मतलब है कि क्लास लोडर ने ग्रिडस्क्वेयर [] कक्षा को लोड नहीं किया है। ऐसा कहा जा रहा है कि यह किसी भी तरह से डीबगर में एक बग की तरह लगता है। कोड के साथ ब्रेकपॉइंट एसोसिएशन थोड़ा टूटा हुआ प्रतीत होता है। या तो आपको लाइन नंबरों को सिंक में लाने के लिए पुन: संकलित करने की आवश्यकता है या कुछ अन्य समस्याएं चल रही हैं। उस बिंदु पर कोड (असाइनमेंट के बाद) इसे लोड करने की आवश्यकता है। जब तक GetSquares वास्तव में उप-वर्ग (GridSquareSubclass []) देता है, उस बिंदु पर JVM ने इसे लोड नहीं किया हो सकता है क्योंकि इसे इसकी आवश्यकता नहीं है (अभी तक)।

+0

क्या किसी विशेष क्षण में कक्षा को लोड करने के लिए JVM को मजबूर करने का कोई तरीका है? एक कंपाइलर निर्देश के समान कुछ? – DanM

+13

आप इसे अपने कोड में कक्षा को लोड करने के लिए मजबूर कर सकते हैं (जैसे एक रेखा है जो कक्षा को स्पष्ट रूप से लोड करती है जैसे कि पहले लाइन के प्रकार की एक नई सरणी बनाना)। आप डीबगर में अभिव्यक्ति का मूल्यांकन करके निर्देश भेजने का भी प्रयास कर सकते हैं। (एक वर्ग की तरह .forName() या Array.newInstance()) – Yishai

+0

ऐसा किया। धन्यवाद!! – DanM

0

मैंने देखा है कि यह ग्रहण में होता है जब आपके पास एक क्लास क्लास के चर को छिपाने वाले सबक्लास के वर्ग चर होते हैं। किसी भी तरह से ग्रहण को भ्रमित करता है (और आम तौर पर वैसे भी एक बुरा विचार है :)। उदाहरण के लिए:

class A { 
    private String a; 
} 

class B extends A { 
    public String a; 
} 
-3

मैं एक ही समस्या का सामना करना पड़ा, मैं सिर्फ एक public static void main प्रणाली बनाया है, एक ही प्रकार के और भागो जावा आवेदन के रूप में की बनाई गई वस्तु, मैं तो हटाया मुख्य विधि, यह अब ठीक काम करता है।

-1

ग्रिडस्क्वेयर शुरू करने से समस्या हल हो जाएगी। वर्ग = नया ग्रिडक्वेयर();

0
//Give a SIZE to the array: 
GridSquare[] squares = GridSquare[this.theGrid.size()]; 

//Fill each element of the array with the object constructor to avoid the null value 
for(int i=0; i<this.theGrid.size(); i++){ 
    squares[i] = new GridSquare(); 
    squares[i] = this.theGrid.getSquares(14, 18, 220, 222); 
} 
1

मैं इस त्रुटि में भाग गया क्योंकि मैं प्रतिबिंब का उपयोग करने वाले कोड पर यूनिट परीक्षण चला रहा था। मैंने कोड की सभी सुविधाओं का परीक्षण करने के लिए एक विशेष कक्षा बनाई थी। जूनिट स्पष्ट रूप से टेस्ट क्लास के लिए एक अलग क्लासलोडर का उपयोग करता है (जो सही समझ में आता है) इसलिए मेरा कोड उस वर्ग पर प्रतिबिंब का उपयोग करने में सक्षम नहीं था। मुझे मिला गया स्टैक ट्रेस बेहद सामान्य था (java.lang.InstantiationException) लेकिन जब मैंने डीबग मोड में चेक किया तो वहां अपवाद ऑब्जेक्ट पर अधिक जानकारी थी (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) जिसने मुझे इस निष्कर्ष तक पहुंचाया।

इसलिए मैंने विशेष कक्षा को मुख्य क्लासलोडर में स्थानांतरित कर दिया (फ़ाइल को src/test/java से src/main/java तक ले जाकर) और यह ठीक काम किया। मुझे इस समाधान को पसंद नहीं है लेकिन मैं एक विकल्प नहीं समझ सकता। मेरे मामले में यह एक बड़ा सौदा नहीं है लेकिन मैं देख सकता हूं कि यह दूसरों के लिए चिंता कैसे हो सकता है।

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

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