2017-02-07 3 views
6

Ich übe Java-fresher interview Coding-Beispiele. Ich versuche, ein Programm zu schreiben, um doppelte Nummern zwischen 1 bis N zu finden, wobei N vom Benutzer zusammen mit den Zahlen selbst angegeben wird. Hier ist der Code:OutOfMemoryError: Java-Heap-Speicher beim Versuch, 5 Ints in ein Array zu lesen

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); 
     } 
    } 

} 

Aber ich bin immer folgende Fehlermeldung in Eclipse Neon:

Enter the number of numbers 
5 

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

Was ist falsch? Warum der JVM-Heap-Speicherfehler? Code kompiliert und läuft gut.

+3

Nun, es ** nicht ** * „gut laufen“ *, das ist, warum Sie hier sind über die Ausnahme fragen ... Ist es auf der Linie abstürzen 'int [] num = new int [a];' Haben Sie versucht, Breakpoints hinzuzufügen und den Code zu debuggen? – luk2302

+4

Wo haben Sie gelernt, wie DataInputStream Benutzereingaben lesen konnte? –

+0

Nein, Sir, ich versuche nicht, irgendjemandes Code zu kopieren. Ich habe nur eine Liste mit Programmen, die ich selbst programmieren kann, und wenn ich keine Logik und Geduld mehr habe, bitte ich um Hilfe. –

Antwort

20

DataInputStream ist für Binär nicht Text. Wenn Sie 4 Bytes eingeben, wird dies in einen 32-Bit-Wert int z. 5, \ n, \ n, \ n ist ungefähr 900 Millionen, weshalb es sich über Speicher beschwert, wenn Sie das Array erstellen. Sie können dies überprüfen, indem Sie den Code in Ihrem Debugger schrittweise durchlaufen.

Was Sie brauchen, ist Text Eingang, versuchen

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

schnelle und ausgezeichnete Bemerkung :) – davidxxx

5

mit hier starten:

DataInputStream in=new DataInputStream(System.in); 

Sie sollten keine DataInputStream verwenden ... und ich sehe, dass Sie bereits Erklärungen bekam über Das.

Aber darüber hinaus:

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

Sie sofort in num [d] und num [e] gleich laufen. Weil Ihre zweite Schleife beispielsweise num [0] mit num [0] vergleicht. Also: Die zweite Schleife muss nur auf Indizes nach dem äußeren laufen!

Darüber hinaus ist es auch unklar, ob Sie wirklich 50 Mal "doppelt" wollen, wenn Sie 50 mal die gleiche Zahl eingegeben haben. Ich würde lieber gehen und die Nummer von Duplikaten für eine Nummer drucken.

Mit anderen Worten: Nach dem Korrigieren des Eingabestream-Problems wird Ihr Code immer noch nicht das Richtige tun.

Und darüber hinaus: Ihre Verwendung von Namen aus einem Zeichen macht es fast unmöglich, leicht zu verstehen, was dieser Code tut.

+0

yeah Ich korrigierte die "flag-on-first-match" Glitch, indem ich mache, wenn (f> 1) –

+0

Sicher, das funktioniert; aber das ist ein falscher Ansatz. Repariere nicht "defekte Daten", indem du sie erwartest - verhindere, dass "defekte Daten" überhaupt erst entstehen! – GhostCat

+0

Bedeutung Planungscode vor der Eingabe? Könnten Sie bitte etwas ausarbeiten, Sir? Machen professionelle Programmierer "Rough Work" vor der Codierung? Wie entsteht Entwicklung im wirklichen Leben? Bitte sag mir, damit ich mich verbessern kann. –

2

Verwenden Sie stattdessen eine Scanner für Ihre Klasse.

Hier ist ein einfaches Beispiel:

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(); 
    } 
Verwandte Themen