2017-12-03 14 views
6
int[][] a = new int[0][5]; 

उपरोक्त कोड जावा में क्यों मान्य है?मैं 0 पंक्तियों के साथ दो आयामी सरणी क्यों बना सकता हूं लेकिन जावा में 5 कॉलम?

यह 2 डी सरणी काफी बेकार है, क्योंकि पहला आयाम शून्य है। तार्किक रूप से, यदि पहला आयाम 0 है, तो दूसरा आयाम 0 से बड़ा नहीं होना चाहिए

मुझे समझ में आता है कि हम 1 डी खाली सरणी शुरू कर सकते हैं।

+2

क्योंकि एक खाली सरणी vallid है? – NickL

+1

यहां तक ​​कि सरल: 'int [] a = new int [0];' –

उत्तर

6

By the JLS, एक सरणी अभिव्यक्ति शून्य के आकार का संकेत मान्य है - यह सिर्फ एक अभिव्यक्ति है - तो आप कानूनी तौर पर एक n आयामी सरणी शून्य प्रमुखता है कि घोषणा कर सकते हैं।

केवल बात यह है कि (जावा 8) के रूप में JLS lexer चेकों whether or not the expression evaluates to zero है:

इसके बाद, आयाम भाव के मूल्यों जाँच कर रहे हैं। यदि किसी भी DimExpr अभिव्यक्ति का मान शून्य से कम है, तो एक नकारात्मक ArraySizeException फेंक दिया जाता है।

यह इसकी उपयोगिता के बारे में कुछ कहते हैं, के रूप में मुझे यकीन है कि आप अवगत हैं कि इस सरणी में सूचकांक के लिए किसी भी प्रयास के बाद से अपनी अनुक्रमणिका स्थान शून्य पर शुरू होता है एक ArrayIndexOutOfBoundsException का उत्पादन करेगा।

+0

आपने मेरा प्रश्न समझा। जवाब के लिए धन्यवाद। तो मूल रूप से, व्याकरण इसे अनुमति देता है, लेकिन यह 2 डी सरणी काफी बेकार है। –

-2

यह पूरी तरह से कानूनी है क्योंकि आप केवल पांच खाली सरणी बनाते हैं।

int[][] arr_ = {{}, {}, {}, {}, {}};

+2

नहीं, आपने एक सरणी घोषित की है जो int [5] [0] है। राइटरस्टेस्ट पैरामीटर शाब्दिक अभिव्यक्ति में सबसे निचले सरणी से मेल खाता है। –

2

यह सामान्य कुछ के रूप में एक खाली सरणी के रूप में सोचने के लिए अजीब नहीं होना चाहिए। एक बहुत ही मामला है जहां हम हर समय खाली सरणी से निपटते हैं।

List<String> names = new ArrayList<String>(); 

names वर्तमान में एक खाली सरणी है। कम से कम पहले तत्व के साथ हमेशा ऐरे घोषित करना अजीब नहीं होगा?

List<String> names = new ArrayList<String>(Arrays.asList("John")); 

new int[0] करने के लिए वैकल्पिक जा रहा है मान्य सिंटैक्स जब पहला तत्व उपलब्ध नहीं है null को सरणी स्थापित करने के लिए किया जाएगा। इस दुनिया में, हमें एक सरणी को फिर से शुरू करने से पहले नियमित रूप से null की जांच करने की उम्मीद की जाएगी।

int[] nums = null; // Because empty primitive arrays are "weird" 

//typical for-each loop 
if(nums != null){ 
    for(int x: nums){ 
     // do something 
    } 
} 
//typical for loop 
if(nums != null){ 
    for(int c = 0; c < nums.length; c++){ 
     // do something 
    } 
} 

खाली सरणियों के बिना, छोरों के लिए नियमित रूप से NullPointerException रों हर समय फेंक होगा। जो कुछ भी कहा गया है, new int[0][] के बजाय new int[0][5] का उपयोग करना अजीब है। मैं इसे एक सिंटैक्स त्रुटि के योग्य है नहीं लगता है, लेकिन मैं इसे आईडीई से इनमें से किसी एक के हकदार लगता है:

warning light

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