Collection-Problem

Windows10

Bekanntes Mitglied
Warum taucht bei folgendem Code, wenn ich diesen Code wo anders aufrufe (ich rufe ihn in der ausführbaren Klasse aus) der Fehler (siehe angefügtes Bild auf)?
Der Code, der in der andere Klasse ausgeführt wird:

Java:
package collection;

import htlgkr.util.*;
import java.util.*;

/**
*
* @author Philipp
*/
public class Dictionary
{

    public void dictionary()
    {
        Map<String, String> d = new HashMap<>();
        List<Map.Entry<String, String>> dict = new ArrayList<>();
        In.open("Woerterbuch.txt");
        while (In.done())
        {
            String line = In.readLine();
            String[] woerter = line.split(";");
            d.put(woerter[0], woerter[1]);
        }
        In.close();

        print(d);

    }

    private void print(Map<String, String> d)
    {
        Out.println("Wörterbuch");
        for (Map.Entry entry : d.entrySet())
        {
            Out.println(entry.getKey());
        }
    }

}
In dieser Klasse wird er ausgeführt (der Code):
Java:
public class Collection
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        Dictionary p = new Dictionary();
        p.dictionary();
    }
}

Der Fehler, der immer auftaucht:
Unbenannt.PNG
 
woerter wird nicht 2 lang sein, das könntest du einfach mal mitm Debugger überprüfen und mit if drum abfangen.
 
woerter wird nicht 2 lang sein, das könntest du einfach mal mitm Debugger überprüfen und mit if drum abfangen.
Aber mit split mache ich ja ein
Code:
String[]
, das ich
Code:
woerter
genannt habe! Dann will ich als erstes Wort das deutsche Wort anfügen, das im
Code:
String[] woerter
an Stelle 1 (also Index 0 ist(
Code:
woerter[0]
)) und dann das englische Wort das im
Java:
String[] woerter
an Stelle 2 ist (also Index 1(
Code:
woerter[1]
))!
Habe ich da was falsch verstanden?
 
Nein, aber dein Arraywoerter[]enthält offenbar höchstens ein Element. Das kannst du mit dem Vorschlag von @mrBrown überprüfen.
Ich habe es bereits mit dem Debugger überprüft und es sind immer zwei Wörter im Array! Ich habe eine Datei geschrieben die ich mit dem Befehl
Code:
In.open("Woerterbuch.txt");
geöffnet hab! Da sind dann pro Zeile ein deutsches und ein englisches Wort mit einem ; getrennt! Mit dem Befehl
Code:
while(!In.done)
{
//code
}
lese ich die Datei solange ein, bis sie fertig eingelesen ist! Mit dem Befehl
Code:
String line=In.readLine();
lese ich eine Zeile ein! Dann splitte ich diese Zeile auf den ; und zwar mit diesem Befehl
Code:
String[] woerter=line.split(";");
! Müsste dann nicht eingentlich in woerter[0] das deutsche Wort und in woerter[1] das englische Wort stehen?
 
Du hattest das Problem behoben bevor du die Frage gestellt hast ?? 🙂🙂🙂 wolltest du sehen ob wir auf die gleiche Lösung kommen 🙂🙂🙂
 
Was denn nun ? x) Wie ist den jetzt der Stand?
Vielleicht hat er einfach zu oberflächlich geprüft. Beispielsweise könnte er am BreakPoint zwei Wörter gesehen und das Programm dann durchlaufen lassen haben, ohne zu prüfen, ob das überhaupt die Iteration war, die die Exception wirft. Es schleicht sich ja auch gerne mal eine zusätzliche Zeilenschaltung am Dateiende ein.😉
 
Damit hast du aber noch nicht überprüft, ob sich wirklich zwei Elemente in dem Array befinden. Sieh' dir das Array doch einfach mal im Debugger an.
Ich hab gerade mit dem Code
Code:
for(int i=0; i<woerter.length;i++)
{
Out.println(woerter[i]); // Klasse Out.println ist in einem Paket meiner Schule und macht das gleiche wie System.out.println();
}
zwischen den beiden Codezeilen
Code:
String[]woerter=line.split("!");
und
Code:
d.put (woerter[0],woerter[1]);
überprüft ob zwei Elemente im Array sind und es waren zwei Elemente in jedem Array! Ansonsten hab ich nichts verändert!
 
Ich hab gerade mit dem Code
Java:
for(int i=0; i<woerter.length;i++)
{
Out.println(woerter[i]); // Klasse Out.println ist in einem Paket meiner Schule und macht das gleiche wie System.out.println();
}
Ich glaube nicht, dass das ein guter Test ist, denn eine Leerzeile zum Schluß kann man damit leicht übersehen. Beispielsweise führt folgender Code:
Java:
public class Split {

    public static void main(String[] args) {
        checkArray("Buch;Book".split(";"));
        checkArray("Hallo;Hello".split(";"));
        checkArray("".split(";"));
    }

    protected static void checkArray(String[] woerter) {
        for (int i=0; i< woerter.length; i++) {
            System.out.println(woerter[i]);
        }
    }
}
zu folgender Ausgabe:
Code:
Buch
Book
Hallo
Hello
Gib an der Stelle lieber die mal Länge des Arrays aus.
 
Bau doch endlich mal eine gescheite Fehlerbehandlung ein Und deine Exception wird weg sein:

Code:
        while (!In.done())
        {
            String line = In.readLine();
            String[] woerter = line.split(";");
            if (woerter.length < 2) {
               System.out.println("Fehler: "+line);
            }
            else {
               d.put(woerter[0], woerter[1]);
            }
        }
 
Zuletzt bearbeitet:
Ich habe die Leerzeile im Text längst entfernt und es kommt noch immer der Fehler!
Dann ist da eben noch ein Fehler. Hast du eigentlich schon einen der zahlreichen Vorschläge direkt oder abgewandelt umgesetzt? Du kannst einfach die Fehlerbehandlung einbauen oder den Debugger vernünftig einsetzen oder Zusatzinformationen ausgeben und mit deiner Datei abgleichen, wie beispielsweise Arraylänge oder Schleifenzähler oder die Variable line (mit vorangestellten und abschliessenden Zusatzzeichen, um auch Ausgaben zu visualisieren) oder ... oder ... oder ....
Du musst dabei natürlich auch immer hinterfragen, welche Aussagekraft deine Tests haben. Du scheinst dir da hin und wieder selbst etwas vorzumachen.
 
Java:
package collection;

import htlgkr.util.*;
import java.util.*;

/**
*
* @author Philipp
*/
public class Dictionary
{

    public void dictionary()
    {
        Map<String, String> d = new HashMap<>();
        List<Map.Entry<String, String>> dict = new ArrayList<>();
        In.open("Woerterbuch.txt");
        while (In.done())
        {
            String line = In.readLine();
            String[] woerter = line.split(";");
            d.put(woerter[0], woerter[1]);
        }
        In.close();

        print(d);

    }

    private void print(Map<String, String> d)
    {
        Out.println("Wörterbuch");
        for (Map.Entry entry : d.entrySet())
        {
            Out.println(entry.getKey());
        }
    }

}
In dieser Klasse wird er ausgeführt (der Code):
Java:
public class Collection
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        Dictionary p = new Dictionary();
        p.dictionary();
    }
}

Warum heißt das Dictionary p (und nicht d)?
Wo kommt In her?
Arbeitet es nicht Objektorientiert?
Wieso heißt der Nichtkonstruktor dictionary fast genauso wie der Konstruktor (Verwechslung möglich)?
Wieso heißt das Package collection (auch Verwechslung möglich)?
Nimm besser BufferedReader.
Und summasummarum:
Java:
        try {
            Map<Integer, String> woerterbuch = new HashMap<>();
            BufferedReader reader = new BufferedReader(new StringReader(
                      "\n"
                    + "1 hallo\n"
                    + "\n"
                    + "2 tschüss\n"));
            String line;
            while ((line = reader.readLine()) != null) {
                String[] split = line.split(" ");
                if (split.length == 2) {
                    try {
                        int i = Integer.parseInt(split[0]);
                        String s = split[1];
                        if (!woerterbuch.containsKey(i)) {
                            woerterbuch.put(i, s);
                        } else {
                            System.out.println("woerterbuch contains key : " + line);
                        }
                    } catch (NumberFormatException ex) {
                        System.out.println(ex + " : " + line);
                    }
                } else {
                    System.out.println("split.length != 2 : " + line);
                }
            }
            reader.close();
            System.out.println("woerterbuch : " + woerterbuch);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

Das deckt jetzt alle Fälle ab. 🙂
 
hey windos10,

schreib doch wie der stand jetzt ist.
Und, kann es sein das du inzwischen ne andere Exception hast? (kommt mir irgendwie so vor, aber sorry wenn dem nicht so ist🙄)
 

Zurück
Oben