Methoden merkwürdige Ausgabe bei text file einlesen

Terry12

Aktives Mitglied
hi,
hab hier eine Methode die aus einer textfile einlesen soll
das 1.Steuerzeichen in der Zeile bestimmt was getan werden soll
+ = add Auftrag
- = remove Auftrag
c = change priority (auftragnummer)

hier ist mein JAVACode:
Java:
try{
        File eingabe = new File(dateipfad);         
        if (eingabe == null) {throw new FileNotFoundException();}
        else if (!eingabe.canRead() || !eingabe.exists()) {throw new KeineLeserechteException();}
        else if (!eingabe.isFile()) {throw new KeineNormaleDateiException();}
        else
            {                
        reader = new LineNumberReader(new BufferedReader(new FileReader(eingabe)));            
            
            while((line = reader.readLine())!= null) {
                if (av1.stackVoll()) {throw new StackIstVollException();}
                else {
            //do{                 
                //line= reader.readLine();
                zeile = reader.getLineNumber();
                if (line.startsWith("-")){
                    System.out.println(zeile + ". Zeile: (-)  ---> loeschen");
                    av1.shiftRemove();
                }
                else if (line.startsWith("+")){   
                    //int aufnr = auftragsnummerLesen(reader,line);                    
                    String prioritaetsnummer= line.substring(1,line.indexOf("\t"));                   
                    int prnr =Integer.parseInt(prioritaetsnummer);   
                    
                    int lasttab = line.lastIndexOf("\t");
                    String auftragsnummer =line.substring(line.indexOf("\t"),line.lastIndexOf("\t"));
                    int aufnr =Integer.parseInt(auftragsnummer);
                    //int aufnr= Integer.valueOf(auftragsnummer).intValue();  
                    //String firma = auftragsgeberLesen(reader,line);                       
                    String firma = line.substring(line.lastIndexOf("\t"));             
                    //av1.erstelleDatei(aufnr,firma);
                    Auftrag obj = new Auftrag(prnr,aufnr,firma);  
                    System.out.print(zeile+". Zeile: hinzufuegen-->");
                    System.out.print(obj.toString());  
                    av1.insert(obj);
                }
                else if (line.startsWith("c")) {
                    //int aufnr = auftragsnummerLesen(reader,line);                                       
                    String prioritaetsnummer= line.substring(1,line.indexOf("\t"));                    
                    int prnr =Integer.parseInt(prioritaetsnummer);   
                    //int zweittab =line.indexOf("\tab",line.lastIndexOf(prioritaetsnummer+"\t"));
                    int lasttab = line.lastIndexOf("\t");
                    //String auftragsnummer =line.substring(line.lastIndexOf(prioritaetsnummer+"\t"),zweittab);
                    String auftragsnummer = line.substring(lasttab);
                    int aufnr =Integer.parseInt(auftragsnummer);
                    //int aufnr= Integer.valueOf(auftragsnummer).intValue();  
                    //String firma = auftragsgeberLesen(reader,line);                    
                    //String firma = line.substring(lasttab);
                    //av1.erstelleDatei(aufnr,firma);
                    //Auftrag obj = new Auftrag(prnr,aufnr,firma);  
                    av1.changePriority(prnr,aufnr,av1);
                    int i= av1.findeAuftragsnummer(aufnr);                    
                    System.out.print(zeile+". Zeile: Prioritaet aendern-->");
                    System.out.print(av1.sucheDatei(i));
                    //System.out.print(obj.toString());  
                    //av1.insert(obj);
                }
                    
                else{
                    System.out.println ("Die "+zeile+". Zeile --> " +line + " beginnt nicht mit (c,+,-) " + 
                    "und konnte nicht ausgelesen werden");
                } 
                System.out.println("\nBisherige Elemente im Stack: \n" + av1.toString());  
                //line= reader.readLine();                
            } 
        }  
        }
            //while( reader.readLine() != null);}
                reader.close();   
        } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
       }

ich lese folgende Textdatei ein:
Java:
+1234	8888	BLABLA
+4325	9999	Test
+12	1000	GAMESTAR
-
c6666	1000
+5555	3920	PCGAMES
+1	3939	KINO
-
-

ich bekomme nur diese merkwürdige Ausgabe über BlueJ in der Konsole:

For input string: " BLABLA"

was ist da los???
 
Zuletzt bearbeitet:
Kann mir nicht vorstellen, dass nur das da steht.

Du versuchst ein String in eine Zahl zu wandeln, die keine Zahl ist.
 
aber warum?
nehmen wir mal die erste Zeile:
Java:
+1234   8888    BLABLA
Java:
String prioritaetsnummer= line.substring(1,line.indexOf("\t"));  
int aufnr =Integer.parseInt(auftragsnummer);
er nimmt den substring ab zeichen 1 ("+" ) bis zum ersten index von Tab zeichen und wandelt es in ein int um...
(=erste Zahl=1234)
Java:
 String auftragsnummer =line.substring(line.indexOf("\t",line.lastIndexOf("\t")));
                    int aufnr =Integer.parseInt(auftragsnummer);
dann nimmt er den ersten substring ab 1.zeichen "Tab" bis zum letzen Zeichen von Tab und wandelt es in ein int um
(=zweite zahl=8888)
Java:
 String firma = line.substring(line.lastIndexOf("\t"));
zum schluss nimmt er den substring ab dem letzten Tab zeichen...(=BLABLA)
was ist daran jetzt falsch? ich checks nicht...
 
dann bekomme ich nur :
Java:
1234
For input string: "	8888"
Ausnahme gefangen: null

edit: ich weiss dass da irgendwas faul ist aber ich komm nicht drauf was, jemand einen tipp für mich?
 
Zuletzt bearbeitet:
hm ich komm nicht drauf wie ichs machen soll:
habs mal geändert aber immernoch error:
Java:
                else if (line.startsWith("+")){   
                    //int aufnr = auftragsnummerLesen(reader,line);                    
                    String prioritaetsnummer= line.substring(1,line.indexOf("\t"));                   
                    int prnr =Integer.parseInt(prioritaetsnummer); 
                    
                    int a = line.indexOf(prioritaetsnummer+"\t");                    
                    
                    int lasttab = line.lastIndexOf("\t");
                    
                    String auftragsnummer =line.substring(a,line.lastIndexOf("\t"));
                    int aufnr =Integer.parseInt(auftragsnummer);
                    
                    int b= line.indexOf(auftragsnummer+"\t");
                    
                    
                    //int aufnr= Integer.valueOf(auftragsnummer).intValue();  
                    //String firma = auftragsgeberLesen(reader,line);                       
                    String firma = line.substring(b); 
                    System.out.println(firma);
                    //av1.erstelleDatei(aufnr,firma);
                    Auftrag obj = new Auftrag(prnr,aufnr,firma);  
                    System.out.print(zeile+". Zeile: hinzufuegen-->");
                    System.out.print(obj.toString());  
                    av1.insert(obj);

ich seh einfach nicht wo das Leerzeichen sein soll, sry bin wohl zu blöd dafür...
 
Zuletzt bearbeitet:
hallo??????keiner bock?

genauso wie du mhn?

" 8888" ist keine zahl, "8888" aber schon

bevor du sowas machst

int prnr =Integer.parseInt(prioritaetsnummer);

schreibst du ein
System.out.println("ich parse :|"+prioritaetsnummer+"|");

dann siehst du genau wo du zu viel einließt

bist du dir sicher dass da nur tabs drinnen stehen zwischen den werten und nicht auch noch ein paar leerzeichen?
 
ja da bin ihc mir absolut sicher habs in dem .txt editor absolut ohne leerzeichen!
auch wenn ich prioritaetsnummer = prioritaetsnummer.trim();
und auftragsnummer = auftragsnummer.trim(); eingebe gehts nicht:

Java:
For input string: "2343	12313123"
Ausnahme gefangen: null
Java:
+2343	12313123	blo
+4325	9999	Test
+12	1000	GAMESTAR
-
c6666	1000
+5555	3920	PCGAMES
+1	3939	KINO
-
-
 
Zuletzt bearbeitet:
Naja hier steht das leerzeichen in der mitte und deswegen funktioniert es auch nicht.

Eventell ist es ein Tab, der nicht korrekt dargestellt wird in der Exception.

Ersetze mal die Tabs durch Semikolon, dann wird das offensichtlicher.

trim() enfernt Leerzeichen am Anfang und am Ende nicht in der Mitte.

Ansonsten:

Problem ist klar. (Keine korrekten Integerwerte, da Leerzeichen vorhanden)

Lösung ist klar: Leerzeichen entfernen.

Nun kommst du dran. Debugausgaben, Debugausgaben, Debugausgaben.
 
wenn ich alles durch ; ersetze bekomme ich :
Java:
For input string: "2343;12313123"
Ausnahme gefangen: null
Java:
  String prioritaetsnummer= line.substring(1,line.indexOf(";"));    
                     prioritaetsnummer = prioritaetsnummer.trim();
                    int prnr =Integer.parseInt(prioritaetsnummer); 
                    
                    int a = line.indexOf(prioritaetsnummer+";");                    
                    
                    int lasttab = line.lastIndexOf(";");
                    
                    String auftragsnummer =line.substring(a,line.lastIndexOf(";"));
                    auftragsnummer = auftragsnummer.trim();
                    int aufnr =Integer.parseInt(auftragsnummer);
                    
                    int b= line.indexOf(auftragsnummer+";");

ich versteh nur nicht warum er den string nicht richtig abtrennt.. ich dachte ich hätte den String richtig unterteilt...
merkwürdig

EDIT : hab ein paar system.out.println eingebaut und er liefert:
Java:
                     String prioritaetsnummer= line.substring(1,line.indexOf(";"));    
                     System.out.println(prioritaetsnummer);
                     prioritaetsnummer = prioritaetsnummer.trim();
                    int prnr =Integer.parseInt(prioritaetsnummer); 
                    System.out.println(prnr);
                    
                    int a = line.indexOf(prioritaetsnummer(";"));     
                    System.out.println(a);
                    
                    int lasttab = line.lastIndexOf(";");
                    System.out.println(lasttab);
                    
                    String auftragsnummer =line.substring(a,line.lastIndexOf(";"));
                    System.out.println(auftragsnummer);
                    auftragsnummer = auftragsnummer.trim();
                    int aufnr =Integer.parseInt(auftragsnummer);
                    System.out.println(aufnr);
                    
                    int b= line.indexOf(auftragsnummer+";");
                    System.out.println(b);

Java:
2343
2343
1
14
2343;12313123
For input string: "2343;12313123"
Ausnahme gefangen: null
 
Zuletzt bearbeitet:
poste doch einmal einen kompletten neuen Stand,
der auch die System.out.println()-Kommandos enthält, so dass man erkennen kann, was du mit beliebigen Meldungen a la
Code:
For input string: "2343;12313123"
Ausnahme gefangen: null
meinst,
ist z.B. ein try/catch mit NullPointerException beteiligt?
im aller ersten Code steht ein try/catch, aber dort ohne 'Ausnahme gefangen'...
gibt auch immer den StackTrace aus um die genaue Zeile zu erhalten, falls du sie nicht schon weißt

----

als Eingabe besser keine Datei, die kann niemand nachvollziehen und "2343;12313123" ist wieder so fraglich,
kann vielleicht ein TeilString statt einer Zeile sein,
ach ne, wird ja sicherlich der Exception-String eines parseInt sein..

schreibe in deinem Quellcode an geeigneter Stelle
> line = ..

also eine konkrete Zeile, die in der weiteren Verarbeitung zu Problemen führt,
und dann benenne die Probleme nochmal genau
> warum er den string nicht richtig abtrennt..
welche Zeile, welcher Teilstring ist fraglich? prioritaetsnummer, auftragsnummer, ..?

mag sein dass vieles aus allen Postings zusammen klar wird, vielleicht antwortet auch noch wer schnell,
ansonsten für Neueinsteiger bitte alles sortieren 😉
 
Zuletzt bearbeitet von einem Moderator:
Quelltext fuer die einlesen Methode:
Java:
else if (line.startsWith("+")){   
                    try{
                     String prioritaetsnummer= line.substring(1,line.indexOf(";"));    
                     System.out.println(prioritaetsnummer);
                     prioritaetsnummer = prioritaetsnummer.trim();
                    int prnr =Integer.parseInt(prioritaetsnummer); 
                    System.out.println(prnr);
                    
                    int a = line.indexOf(prioritaetsnummer+(";"));     
                    System.out.println(a);
                    
                    int lasttab = line.lastIndexOf(";");
                    System.out.println(lasttab);
                    
                    String auftragsnummer =line.substring(a,line.lastIndexOf(";"));
                    System.out.println(auftragsnummer);
                    auftragsnummer = auftragsnummer.trim();
                    int aufnr =Integer.parseInt(auftragsnummer);
                    System.out.println(aufnr);
                    
                    int b= line.indexOf(auftragsnummer+";");
                    System.out.println(b);
                
                    
                    //int aufnr= Integer.valueOf(auftragsnummer).intValue();  
                    //String firma = auftragsgeberLesen(reader,line);                       
                    String firma = line.substring(b); 
                    System.out.println(firma);
                    //av1.erstelleDatei(aufnr,firma);
                    
                    Auftrag obj = new Auftrag(prnr,aufnr,firma);  
                    System.out.print(zeile+". Zeile: hinzufuegen-->");
                    System.out.print(obj.toString());  
                    av1.insert(obj);
                }catch (Throwable t)
                {System.out.println(t.getMessage()); t.printStackTrace();}
                }

Meine Text-Datei:

Java:
+2343;12313123;blo	
+4325;9999;Test
+12;1000;GAMESTAR
-
c6666;1000
+5555;3920;PCGAMES
+1;3939	KINO
-
-


Ausgabe:

Java:
2343
2343
1
14
2343;12313123
For input string: "2343;12313123"

Bisherige Elemente im Stack: 

4325
4325
1
10
4325;9999
For input string: "4325;9999"

Bisherige Elemente im Stack: 

12
12
1
8
12;1000
For input string: "12;1000"

Bisherige Elemente im Stack: 

4. Zeile: (-)  ---> loeschen
Der Stack ist leer oder es wurde noch kein Stack fuer Dateiaufnahme angelegt!
Ausnahme gefangen: null
Bitte waehlen Sie einen Menuepunkt aus : ---->

hier faellt auf
Java:
int a = line.indexOf(prioritaetsnummer+(";"));
liefert in der ausgabe : "1" das stimmmt nicht... er sollte doch nach dem ersten zeichen von "prioritaetsnummer+(";")" suchen und die Position zurueckgeben warum tut er das nicht?
darf ich in der Methode nicht mit string + "string" hantieren?


Fehlermeldungen:
Java:
java.lang.NumberFormatException: For input string: "2343;12313123"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at AuftragsverwaltungDialog.einlesenDatei(AuftragsverwaltungDialog.java:241)
	at AuftragsverwaltungDialog.ausfuehrenFunktion(AuftragsverwaltungDialog.java:129)
	at AuftragsverwaltungDialog.start(AuftragsverwaltungDialog.java:74)
	at AuftragsverwaltungDialog.main(AuftragsverwaltungDialog.java:334)
	at __SHELL8.run(__SHELL8.java:6)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:724)
java.lang.NumberFormatException: For input string: "4325;9999"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at AuftragsverwaltungDialog.einlesenDatei(AuftragsverwaltungDialog.java:241)
	at AuftragsverwaltungDialog.ausfuehrenFunktion(AuftragsverwaltungDialog.java:129)
	at AuftragsverwaltungDialog.start(AuftragsverwaltungDialog.java:74)
	at AuftragsverwaltungDialog.main(AuftragsverwaltungDialog.java:334)
	at __SHELL8.run(__SHELL8.java:6)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:724)
java.lang.NumberFormatException: For input string: "12;1000"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at AuftragsverwaltungDialog.einlesenDatei(AuftragsverwaltungDialog.java:241)
	at AuftragsverwaltungDialog.ausfuehrenFunktion(AuftragsverwaltungDialog.java:129)
	at AuftragsverwaltungDialog.start(AuftragsverwaltungDialog.java:74)
	at AuftragsverwaltungDialog.main(AuftragsverwaltungDialog.java:334)
	at __SHELL8.run(__SHELL8.java:6)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:724)
 
Zuletzt bearbeitet:
die zugehörige Zeile musste ich mir zwar selber suchen und noch mit Semikolon ausstatten, danach sieht es aber leicht aus:

wie dir deine knappen Ausgaben selber zeigen, liefert
> int a = line.indexOf(prioritaetsnummer+(";"));
den Index 1, direkt nach dem +,
daher dann der Substring 2343;12313123, welcher schlecht zu parsen ist,

fertig, Ende der Feststellung, das kann dich doch in keiner Form überraschen?
was indexOf() macht sollte klar sein, die Ausgabe bestätigt es,

edit:
> hier faellt auf
> int a = line.indexOf(prioritaetsnummer+(";"));
> liefert in der ausgabe : "1" das stimmmt nicht...
ok, auch schon gesehen, tja, indexOf() liefert den Anfang, warum das Ende?

wenn du den Index direkt nach der prioritaetsnummer haben willst, dann könntest du die Länge dieses Strings drauf addieren,
oder hier wäre es auch leicht, einfach das erste indexOf() eines Semikolons zu suchen, ist vorerst ja das erste

(edit: hattest du ganz früher ja auch, wie ich jetzt sehe
> String auftragsnummer =line.substring(line.indexOf("\t",line.lastIndexOf("\t")))
wobei dann immer an +1 oder -1 gedacht werden muss, je nachdem ob das Index-Zeichen selber mit dabei sein soll oder nicht)

jedenfalls sind das doch leichte String-Methoden, denke mal nach inwiefern da nichts zu verstehen
oder tagelang zu probieren ist

gerade da du schon mit einigen indexOf() + sogar lastIndexOf() hantierst, solltest du doch schon bisschen was davon verstehen,
der Weg ist der richtige, nur auch was draus lernen, Probleme anschauen und konstruktiv weiter probieren
 
Zuletzt bearbeitet von einem Moderator:
Ist die Frage noch immer warum "2343;12313123" keine zahl ist?
ja da bin ihc mir absolut sicher habs in dem .txt editor absolut ohne leerzeichen!
warum splittest du dann mit \t ?
Wie ist das format deiner Textdatei? getrennt durch tab, spaces, ; fixe abstände?
 

Zurück
Oben