# java.lang.OutOfMemoryError



## Sirakov (14. Februar 2005)

Guten Abend 
ich habe ein Konvertor mit 2 Textareas gemacht (für Ein- und Ausgabe), wenn ich reinen Text eingebe - funktioniert alles PEFEKT. Wenn ich eine Datei öffne, dann kommt der Inhalt der Datei in dem ersten Textbereich. Falls die Datei ganz klein ist (d.h. 1-2 Zeilen) wird alles richtig konvertiert, falls aber die Datei größer ist, bekomme ich "java.lang.OutOfMemoryError" als Meldung und der Prozess der Konvertierung wird abgebrochen. Kann mir jemand sagen, wo sich das Problem befindet und wie ich das Problem löse.

Danke,
AA


----------



## teppi (15. Februar 2005)

Ein wenig Quellcode wäre recht hilfreich  .. Normalerweise tritt dieser Fehler auf, wenn dein Programm den für ihn reservierten Speicherplatz im RAM überschreitet. Jedoch sollte für solch ein recht simples Programm der Speicher in jedem Fall ausreichen ... Ich nehme an da läuft in irgendeiner Schleife der Speicher voll, weil Objekte nicht vom Garbage Collector gelöscht werden, da du die Referenzen auf sie nicht löschst ..


----------



## J-C (15. Februar 2005)

Hmm, auf Grund deiner Angaben denke ich dass der Fehler in deinem Programm liegt - wie du es löst kann ich dir mit den par Infos nicht sagen...

Vielleicht wäre es Sinnvoll, ein paar Zeilen Code zu posten... z.B. der Teil in dem du die Datei einliest.. sollte so viel nicht sein!


----------



## Sirakov (15. Februar 2005)

Hallo,
ich wollte bisschen Sourcecode posten, wusste aber nicht, wo genau sich das Problem befindet. Hier ist der Teil, wo ich die Datei einlese:

-------------
final JMenuItem openFile = new JMenuItem(MainWin.openNewFile);
            editMenu.add(openFile);
            openFile.addActionListener(new ActionListener() {
                public void actionPerformed(final ActionEvent ae) {
                    final int retval = fc.showOpenDialog(MainWin.this);
                    if (JFileChooser.APPROVE_OPTION == retval) {
                        final File myFile = fc.getSelectedFile();
                        editArea1.setText("");
                        try {
                            FileReader datei;
                            datei = new FileReader(myFile);

                            final BufferedReader dat_read = new BufferedReader(datei);
                            name = dat_read.readLine();

                            while (null != name) {
                                editArea1.append(name+"\n");
                                name = dat_read.readLine();
                            }
                            dat_read.close();
                        } catch (FileNotFoundException e) {
                            JOptionPane.showMessageDialog(null, new StringBuffer().append("File not found!").toString());
                        } catch (IOException e) {
                            JOptionPane.showMessageDialog(null, e.getMessage());
                        }
                    }
                }
            });
-------------

Vielleicht ist das Problem winzig, aber ich finde es leider nicht 

Grüß,
Atanas

PS. Die Datei wird einwandfrei gelesen.


----------



## takidoso (15. Februar 2005)

hallo,
manchmal hilft es den Stack-Trace nachzugehen, um z.B.  eventuelle unerwartete Schleifen aufzudecken.
Eine weitere Möglichkeit bieten Ausgaben an makante Punkten um zu schauen wo oder ab wann es genau hakt.

takidoso


----------



## Thomas Darimont (15. Februar 2005)

Hallo!

ich vermute mal, dass der Hase in deiner "Kovertierung" im Pfeffer liegt.
Was machst du da genau und poste doch bitte den "relevanten" Codeabschnitt der die Kovertierung leistet.

Gruß Tom


----------



## takidoso (15. Februar 2005)

ein zweiter Blick in Deinen Code gibt mir schon einen gewissen Verdacht, aber vielleicht gehst Du erstmal obige Tips nach, vielleicht kommst Du dann drauf, oder schau doch noch mal ganz genau auf Deine Schleifenabbruchbedingung.

takidoso


----------



## Thomas Darimont (15. Februar 2005)

Hallo!

Also die Abbruchbedingung in der while Schleife sollte so auf jeden Fall zutreffen wenn das Ende der Datei erreicht ist.

Gruß Tom


----------



## J-C (15. Februar 2005)

Oh ich seh grad, dass das schon jemand bemerkt hat


----------



## Sirakov (15. Februar 2005)

also....ich konvertiere kyrillische Buchstaben im Unicode:

-----------
private static String m_decode(final String eingabe) {
        StringBuffer convert_eingabe = new StringBuffer(eingabe);
        int len = convert_eingabe.length();
        int j = 0;
        for (int i = 0; i < len; i += j) {
            final char b = convert_eingabe.charAt(i);
            Label:if (b == 'À') {
                convert_eingabe.replace(i, i + 1, "?");
                j = 7;
                break Label;
            } else if (b == 'Á') {
                convert_eingabe.replace(i, i + 1, "?");
                j = 7;
                break Label;
                .
                .
                .
                } else {
                convert_eingabe = new StringBuffer("YOU HAVE ENTERED A NON VALID                SYMBOL!");
                i = len;
                break Label;
            }
            len = convert_eingabe.length();
        }
        final String s = convert_eingabe.toString();
        return s;
    }

-----------
wie ich schon mal erwähnt habe, funktioniert alles PERFEKT, wenn ich reinen Text eingebe (egal wie lang), aber sobald ich eine Textdatei mit mehreren Zeilen öffne, kriege ich das Problem.

Grüß,
AA

PS. Wie ich gerade gesehen habe, wird die Source-Code falsch Dargestellt, richtig wäre else if (b == '?') {convert_eingabe.replace(i, i + 1, "& #1041;");


----------



## takidoso (15. Februar 2005)

also da kann ich Dir wirklich nur einen Debugging-Durchgang empfehlen.

Takidoso


PS: break Label (schade das es noch solche konstrukte in Java vorhanden sind, sowas gehört wirklich nicht in eine moderne Sprache   )


----------



## Sirakov (15. Februar 2005)

also...dann werde ich die Schleife kontrollieren, vielleicht finde ich den Fehler  danke


----------



## Sirakov (15. Februar 2005)

ich bins wieder,
ihr habt Recht gehabt, das Problem ist eine Schleife  habe es jetzt gelöst....."break Label" war das Problem  ich danke euch allen 

Gruß,
Atanas


----------

