2017-02-07 7 views
6

मैं जावा फ्रेशर साक्षात्कार कोडिंग उदाहरणों के लिए अभ्यास कर रहा हूं। मैं 1 से N के बीच डुप्लिकेट संख्याओं को खोजने के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं, जहां उपयोगकर्ता को नंबरों के साथ स्वयं को दिया जाता है।OutOfMemoryError: जावा हेप स्पेस एक सरणी में 5 इंच पढ़ने की कोशिश करते समय

import java.io.DataInputStream; 
import java.io.IOException; 

public class DuplicateNumbers { 

    public static void main(String[] args) throws IOException { 
     DataInputStream in = new DataInputStream(System.in); 

     System.out.println(" Enter the number of numbers "); 

     int a = in.readInt(); 
     int[] num = new int[a]; 
     System.out.println(" Enter the ints one by one "); 
     for (int b = 0; b < a; b++) { 
      System.out.println(" Enter no "+(b+1)); 
      num[b]=in.readInt(); 
     } 
     int c = 0; 
     for (int d = 0; d < a; d++) { 
      int f = 0; 
      c = num[d]; 
      for (int e=0; e<a; e++) { 
       if (c==num[e]) { 
        f++; 
       } 
      } 

      if(f > 1) 
       System.out.println(" Duplicate number "+c); 
     } 
    } 

} 

लेकिन मैं ग्रहण नियॉन में निम्न त्रुटि हो रही है:

Enter the number of numbers 
5 

Exception in thread "main" java.lang.OutOfMemoryError: 
Java heap space at DuplicateNumbers.main(DuplicateNumbers.java:14) 

क्या गलत है यहाँ कोड है? JVM ढेर अंतरिक्ष त्रुटि क्यों? कोड संकलित करता है और ठीक चलाता है।

+3

यह ** नहीं ** * "ठीक चलाने" करता है *, यही वजह है कि तुम यहाँ अपवाद के बारे में पूछ रहे हैं ठीक है, ... यह लाइन पर क्रैश हो रहा है:

यहाँ एक बुनियादी उदाहरण है 'int [] num = new int [a]; 'क्या आपने ब्रेकपॉइंट जोड़ने और कोड को डीबग करने का प्रयास किया है? – luk2302

+4

आपने डेटा इनपुट को पढ़ा था कि उपयोगकर्ता इनपुट कैसे पढ़ा जाए? –

+0

नहीं सर, मैं किसी के कोड की प्रतिलिपि बनाने की कोशिश नहीं कर रहा हूं। मेरे पास अभ्यास करने के लिए कार्यक्रमों की एक सूची है, जहां मैं अपने आप को कोड करने का प्रयास करता हूं, और जब मैं तर्क और धैर्य से बाहर निकलता हूं, तो मैं मदद मांगता हूं। –

उत्तर

20

डाटाइनपुटस्ट्रीम बाइनरी के लिए पाठ नहीं है। जब आप 4 बाइट टाइप करते हैं, तो यह 32-बिट int मान में बदल जाता है उदा। 5, \ n, \ n, \ n लगभग 900 मिलियन है, यही कारण है कि जब आप सरणी बनाते हैं तो यह स्मृति के बारे में शिकायत करता है। आप अपने डीबगर में कोड के माध्यम से कदम उठाकर इसे देख सकते हैं।

आपको क्या चाहिए पाठ इनपुट, यहाँ शुरू

Scanner in = new Scanner(System.in); 
System.out.println("Enter the number of numbers"); 
int a = in.nextInt(); 
in.nextLine(); // discard the rest of the line. 
+0

तेज़ और उत्कृष्ट टिप्पणी :) – davidxxx

5

उपयोग करने का प्रयास है:

DataInputStream in=new DataInputStream(System.in); 

आप एक DataInputStream उपयोग नहीं करना चाहिए ... और मुझे लगता है कि आप पहले से ही के बारे में स्पष्टीकरण मिल गया उस।

लेकिन उस से परे:

for(int e=0; e<a; e++) 

आप तुरंत संख्या [घ] और संख्या [ई] बराबर होने में चलेंगे। क्योंकि आपका दूसरा पाश वास्तव में संख्या [0] के साथ num [0] की तुलना करता है उदाहरण के लिए। तो: दूसरे लूप को बाहरी के बाद केवल इंडेक्स पर ही चलाने की आवश्यकता है!

इसके अलावा, यह भी अस्पष्ट है कि यदि आप वास्तव में 50 गुणा समान डुप्लिकेट चाहते हैं तो आप 50 गुणा "डुप्लिकेट" चाहते हैं। मैं संख्या के लिए डुप्लिकेट के संख्या पर जाकर प्रिंट करूंगा।

दूसरे शब्दों में: इनपुट स्ट्रीम समस्या को ठीक करने के बाद, आपका कोड अभी भी सही चीज़ नहीं करेगा।

और उससे परे: एकल-चरित्र नामों का उपयोग यह आसानी से समझना लगभग असंभव बनाता है कि यह कोड क्या कर रहा है।

+0

हाँ मैंने "फ्लैग-ऑन-फर्स्ट-मैच" गड़बड़ को सही किया है, अगर (एफ> 1) –

+0

निश्चित रूप से, यह काम करता है; लेकिन यह एक गलत दृष्टिकोण है। इसे "टूटा हुआ डेटा" ठीक करने के लिए ठीक न करें - "टूटे हुए डेटा" को पहले स्थान पर आने से रोकें! टाइप करने से पहले – GhostCat

+0

अर्थ योजना कोड? क्या आप कृपया विस्तृत कर सकते हैं, महोदय? पेशेवर प्रोग्रामर कोडिंग से पहले "कठिन काम" करते हैं? वास्तविक जीवन में विकास कैसे होता है? कृपया मुझे बताएं ताकि मैं सुधार कर सकूं। –

2

इसके बजाय अपनी कक्षा के लिए Scanner का उपयोग करने का प्रयास करें।

public static void main(String[] args) throws IOException 
    { 
     System.out.println("Enter a number: "); 
     Scanner sc = new Scanner(System.in); 
     String item = sc.next(); 
     System.out.println("Your item is: " + item); 
     sc.close(); 
    } 
संबंधित मुद्दे