2008-10-28 14 views
19

मेरे पास एक यूनिट टेस्ट है जहां मैंने एक फ़ाइल के बाइट डेटा के रूप में एक बड़े बाइट सरणी (8000 बाइट्स से अधिक) को सांख्यिकीय रूप से परिभाषित किया है, जब भी मैं अपना यूनिट परीक्षण चलाता हूं, मैं पढ़ना नहीं चाहता हूं।javac त्रुटि "कोड बहुत बड़ा"?

private static final byte[] FILE_DATA = new byte[] { 
12,-2,123,................ 
} 

इस ग्रहण के भीतर ठीक संकलित है, लेकिन जब चींटी स्क्रिप्ट मैं निम्नलिखित त्रुटि मिलती है के माध्यम से संकलन:

[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large 
[javac]  private static final byte[] FILE_DATA = new byte[] { 
[javac]        ^

कोई भी विचार क्यों और मैं यह कैसे बच सकते हैं?


उत्तर: Shimi के जवाब चाल किया था। मैंने बाइट सरणी को एक अलग वर्ग में ले जाया और यह ठीक संकलित हुआ। धन्यवाद!

+0

तो यह ग्रहण में क्यों काम किया ?? – paxdiablo

+1

मुझे पता है कि ग्रहण जावैक की तुलना में एक अलग कंपाइलर का उपयोग कर रहा है। शायद यह समझाएगा। –

+0

आह, हाँ मैं इसे भूल गया। मैंने जेडीके से पहले इसे संकलित करने के लिए एक्लिप्स स्थापित किया - यह तब हुआ जब मुझे पता चला कि इसका स्वयं का कंपाइलर बनाया गया है। – paxdiablo

उत्तर

22

जावा में विधियां बाइट कोड में 64k तक सीमित हैं। स्टेटिक प्रारंभिक एक विधि में किए जाते हैं (link देखें)
आप किसी फ़ाइल से सरणी डेटा लोड करने का प्रयास कर सकते हैं।

0

आप @BeforeClass स्थैतिक विधि में फ़ाइल से बाइट सरणी लोड कर सकते हैं। यह सुनिश्चित करेगा कि यह आपके सभी यूनिट परीक्षणों के लिए केवल एक बार लोड हो जाएगा।

0

आप आंतरिक कक्षाओं का लाभ उठा सकते हैं क्योंकि प्रत्येक की अपनी 64 केबी सीमा होगी। यह आपको एक बड़ी सरणी के साथ मदद नहीं कर सकता है क्योंकि आंतरिक वर्ग आपकी मुख्य कक्षा के समान स्थिर प्रारंभिक सीमा के अधीन होगा। हालांकि, आपने कहा है कि आप अपनी सरणी को एक अलग वर्ग में ले जाकर समस्या को हल करने में कामयाब रहे हैं, इसलिए मुझे संदेह है कि आप अपनी मुख्य कक्षा में केवल एक ही सरणी से अधिक लोड कर रहे हैं।

बजाय:

private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>}; 

प्रयास करें:

private static final class FILE_DATA 
{ 
    private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>}; 
} 

तो फिर तुम FILE_DATA.VALUES[i] बजाय FILE_DATA[i] के रूप में मानों तक पहुंच सकते हैं, लेकिन तुम सिर्फ 64KB के बजाय एक 128KB सीमा के अधीन कर रहे हैं।

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