2012-07-17 21 views
24

मैं एक ओपन सोर्स प्रोजेक्ट है, जहां वे एक निर्गम धारा निर्माण कर रहे थे के माध्यम से जा रहा था, और निम्न विधि भर में आया था:जावा सरणी लंबाई 0 से कम है?

@Override public void write(byte[] buffer, int offset, int length) { 
    if (buffer == null) { 
     throw new NullPointerException("buffer is null"); 
    } 
    if (buffer.length < 0) { // NOTE HERE 
     throw new IllegalArgumentException("buffer length < 0"); 
    } 
    if (offset < 0) { 
     throw new IndexOutOfBoundsException(String.format("offset %d < 0", offset)); 
    } 
    if (length < 0) { 
     throw new IndexOutOfBoundsException(String.format("length %d < 0", length)); 
    } 
    if (offset > buffer.length || length > buffer.length - offset) { 
     throw new IndexOutOfBoundsException(String.format("offset %d + length %d > buffer"              " length %d", offset, length, buffer.length)); 
    } 
} 

तो byte[] buffer सिर्फ एक सामान्य वर्ष byte[] है। हम जानते हैं कि यह शून्य नहीं है। क्या यह 0 से कम की लंबाई बनाने के लिए भी संभव है? जैसे, यह प्रतिबिंब के साथ किया जा सकता है और यही वह है जिसके खिलाफ वे सुरक्षा कर रहे हैं?

+0

आपका क्या मतलब है "हम जानते हैं कि यह 'शून्य' नहीं है? –

+3

@EdwardThomson: मुझे लगता है क्योंकि पहला कथन 'बफर == नल' –

+0

की जांच करता है शायद उस परियोजना में कहीं और यह एक सम्मेलन है कि '-1' यह कहने के तरीके के रूप में मान्य है कि एक सूचकांक अमान्य है या ऐसा कुछ है और यहां अंत में यह एक अपवाद में बदल गया है। – thalador

उत्तर

29

से संरक्षित है, नहीं, यह कभी नहीं हो सकता है। जावा विनिर्देशों के अनुसार लंबाई को गैर-ऋणात्मक होने की गारंटी है।

एक सरणी प्रकार के सदस्यों निम्न में से सभी कर रहे हैं:

  • सार्वजनिक अंतिम क्षेत्र लंबाई, जो घटकों सरणी के की संख्या में शामिल है। लंबाई सकारात्मक या शून्य हो सकती है।

स्रोत: JLS §10.7

mprivat उल्लेख किया है, अगर आप कभी भी नकारात्मक आकार की एक सरणी बनाने की कोशिश, एक NegativeArraySizeException फेंक दिया जाएगा।

+0

फिर इसके लिए क्यों जांचें (<0)? – Reimeus

+4

@ रीमेस इस पर चर्चा करने के लिए कुछ लोगों को अच्छे लोगों को देने के लिए। –

+9

@ रीमेमस: क्योंकि प्रोग्रामर कभी भी कोई गलती नहीं करते हैं और हमेशा सबसे इष्टतम कोड लिखते हैं। – tskuzzy

6

मुझे विश्वास नहीं है कि यह संभव है। प्रतिबिंब के माध्यम से भी, यह नकारात्मक आरे साइसेजएक्सप्शन

+0

मैंने प्रतिबिंबित रूप से सरणी की लंबाई को बदलने का प्रयास किया है, लेकिन मुझे ऐसा करने में असमर्थ पाया गया है। 'GetDeclaredFields()' विधि एक सरणी इनपुट के लिए एक खाली परिणाम देता है, और 'ऐरे' प्रतिबिंब वर्ग में समझदारी से ऐसी कोई विधि नहीं है (क्योंकि आप इसे कभी क्यों चाहेंगे?) मुझे लगता है कि स्मृति को संशोधित करने से कम नहीं होगा ऐसा करने का तरीका, लेकिन मुझे संदेह है कि वास्तव में एक चेक है जो इसे रोक देगा। बेशक, यदि कोई प्रोग्राम आपके ऊपर मेमोरी को संशोधित कर रहा है, तो आपको पैरामीटर चेक के साथ पकड़ने की तुलना में बड़ी समस्याएं हैं ... – corsiKa

+0

हाँ, मुझे लगता है कि यह सिर्फ खराब कोड था। ऐसा करने के लिए केवल कुछ प्रकार के बाइट कोड संशोधन करना होगा। और स्पष्ट रूप से, इसके साथ भी, मुझे 100% यकीन नहीं है कि अगर आप किसी भी तरह से हस्ताक्षर किए गए नंबर के रूप में कोडित हो सकते हैं (जो मुझे संदेह है)। – mprivat

+0

मुझे नहीं लगता कि यह है, क्योंकि आप 'int [] a = new int [3000000000] संकलित नहीं कर सकते; '- मुझे संदेह है कि इसे किसी अन्य की तरह' int 'के रूप में संग्रहीत किया जाता है। – corsiKa

0

यह सिर्फ एक अपवाद हैंडलिंग समस्या है। आपको जावा में नकारात्मक आकार के साथ एक सरणी बनाने की अनुमति है - जब आप इसे संकलित करते हैं तो यह अपवाद भी नहीं फेंकता है। लेकिन रन टाइम पर, आपका प्रोग्राम तब तक नहीं चलेगा जब तक यह सही नहीं हो जाता है। (यह NegativeArraySizeException फेंक देगा।)

समस्या इस संकल्प को संकलित समय के बजाए रन टाइम पर फेंक दिया गया है - यही कारण है कि अपवाद को IllegalArgumentException के साथ संभाला गया है।

+0

अच्छा लेकिन कुछ और स्पष्टीकरण की आवश्यकता है .. – Shivaay

+0

"* आपको जावा * में नकारात्मक आकार के साथ एक सरणी बनाने की अनुमति है" - नहीं, आप नहीं हैं। आप * लिख सकते हैं * नया int [-1] 'लेकिन JVM ऐसी सरणी नहीं बनाएगा। कोई जावा सरणी ऑब्जेक्ट की ऋणात्मक लंबाई कभी नहीं होगी। – dimo414

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