Datei zeilenweise lesen, Rückgabewert = null

IcocaI

Mitglied
Hi

ich darf mal wieder an JAVA ran ... hab da folgendes Problem:

sollte eigentlich einfach sein aber, wenn ich aus einer Datei lesen möchte, fängt der erst am Ende an. Jedenfalls kommt mir das so vor, weil der mir nur null wiedergibt.
Sitze daran schon ca. ne Stunde und komme nicht mehr weiter.

Java:
Gehaltsabrechnung

package Aufgabe3;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class Gehaltsabrechnung {
	StdInput r;
	
	Arbeiter []arbeiter = new Arbeiter[5];
	Angestellter []angestellter = new Angestellter[5];
	
	int personalnummer;
	String name;
	double grundgehalt;
	double ortszuschlag;
	double stundenlohn;
	double anzahl_der_Arbeitsstunden;
	
	public void start() throws IOException{
		System.out.print("Arbeiter dann Angestellter\n\n");
		for(int i = 0; i < arbeiter.length; i++){
			arbeiter[i] = new Arbeiter(0, null, 0, 0);
			angestellter[i] = new Angestellter(0, null, 0, 0);
		}
		
		this.mArbeiter();
	//	this.mAngestellter();
		this.mAusgabe();
	}
	
	public void mArbeiter(){
		try{
			FileReader out = new FileReader("Arbeiter.txt");
			BufferedReader br = new BufferedReader(out);

			String zeile = null;
			for(int i = 0; i < 5; i++){
				System.out.print(br.readLine());
				while((zeile = br.readLine()) != null){
					personalnummer = Integer.valueOf(br.readLine());
					//arbeiter[i].setPersonalnummer(personalnummer);
					name =br.readLine();
					//arbeiter[i].setName(name);
					stundenlohn = Double.valueOf(br.readLine());
					//arbeiter[i].setStundenlohn(stundenlohn);
					anzahl_der_Arbeitsstunden = Double.valueOf(br.readLine());
					//arbeiter[i].setAnzahl_der_arbeitsstunden(anzahl_der_Arbeitsstunden);
					arbeiter[i] = new Arbeiter(personalnummer, name, stundenlohn, anzahl_der_Arbeitsstunden);
				}
			}
			br.close();
		} catch(IOException e){
			e.printStackTrace();
		}
	}
	
	public void mAngestellter() throws IOException{
		
		FileReader out = new FileReader("Angestellter.txt");
		BufferedReader br = new BufferedReader(out);

		String zeile = null;
		for(int i = 0; i < 5; i++){
			while((zeile = br.readLine()) != null){
				personalnummer = Integer.valueOf(br.readLine());
				//angestellter[i].setPersonalnummer(personalnummer);
				name = br.readLine();
				//angestellter[i].setName(name);
				grundgehalt = Double.valueOf(br.readLine());
				//angestellter[i].setGrundgehalt(grundgehalt);
				ortszuschlag = Double.valueOf(br.readLine());
				//angestellter[i].setOrtszuschlag(ortszuschlag);
				angestellter[i] = new Angestellter(personalnummer, name, grundgehalt, ortszuschlag);
				i++;
			}
		}
		br.close();
	}
	
	public void mAusgabe(){
		for(int x = 0; x < 5; x++){
			System.out.print("\n\nPersonalnummer: "+angestellter[x].getPersonalnummer());
			System.out.print("\nName: "+angestellter[x].getName());
			System.out.print("\nGrundgehalt: "+angestellter[x].getGrundgehalt());
			System.out.print("\nOrtszuschlag: "+angestellter[x].getOrtszuschlag());
		}
		for(int y = 0; y < 5; y++){
			System.out.print("\n\nPersonalnummer: "+arbeiter[y].getPersonalnummer());
			System.out.print("\nName: "+arbeiter[y].getName());
			System.out.print("\nStundenlohn: "+arbeiter[y].getStundenlohn());
			System.out.print("\nAnzahl der Stunden: "+arbeiter[y].getAnzahl_der_arbeitsstunden());
		}
	}
}

Java:
Angestellter

package Aufgabe3;

public class Angestellter extends Mitarbeiter{

	private double grundgehalt;
	private double ortszuschlag;
	
	public Angestellter(int personalnummer, String name, double grundgehalt, double ortszuschlag) {
		super(personalnummer, name);
		this.grundgehalt = grundgehalt;
		this.ortszuschlag = ortszuschlag;
	}
	public double getGrundgehalt() {
		return grundgehalt;
	}
	public void setGrundgehalt(double grundgehalt) {
		this.grundgehalt = grundgehalt;
	}
	public double getOrtszuschlag() {
		return ortszuschlag;
	}
	public void setOrtszuschlag(double ortszuschlag) {
		this.ortszuschlag = ortszuschlag;
	}
	
	public double monatsbrutto(){
		return grundgehalt + ortszuschlag;
	}
}

Java:
Arbeiter

package Aufgabe3;

public class Arbeiter extends Mitarbeiter{
	
	private double stundenlohn;
	private double anzahl_der_arbeitsstunden;
	
	public Arbeiter(int personalnummer, String name, double stundenlohn, double anzahl_der_arbeitsstunden) {
		super(personalnummer, name);
		this.stundenlohn = stundenlohn;
		this.anzahl_der_arbeitsstunden = anzahl_der_arbeitsstunden;
	}
	
	public double getStundenlohn() {
		return stundenlohn;
	}
	public void setStundenlohn(double stundenlohn) {
		this.stundenlohn = stundenlohn;
	}
	public double getAnzahl_der_arbeitsstunden() {
		return anzahl_der_arbeitsstunden;
	}
	public void setAnzahl_der_arbeitsstunden(double anzahl_der_arbeitsstunden) {
		this.anzahl_der_arbeitsstunden = anzahl_der_arbeitsstunden;
	}
	
	public double monatsbrutto(){
		return stundenlohn * anzahl_der_arbeitsstunden;
	}
	
}

Java:
Mitarbeiter

package Aufgabe3;

public class Mitarbeiter {
	private int personalnummer;
	private String name;
	
	public Mitarbeiter(int personalnummer, String name){
		this.personalnummer = personalnummer;
		this.name = name;
	}
	
	public int getPersonalnummer() {
		return personalnummer;
	}
	public void setPersonalnummer(int personalnummer) {
		this.personalnummer = personalnummer;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

Mitarbeiter = Oberklasse
Angestellter = Unterklasse
Arbeiter = Unterklasse

Code:
Angestellter.txt

6
Klaus Hunter
1800
200
7
Otto Igel
2000
500
8
Jorg Klone
1950
150
9
Jean Apple
2400
400
10
Frank Rettung
3500
500

Code:
Arbeiter.txt

1
Peter Ganz
7.5
38
2
Julius Hallo
7.5
38
3
Johannes Gräber
7.9
37
4
Andreas Kloster
13.8
40
5
Matthias Kolt
20.1
35

Das ganze ist eine Schulaufgabe ist aber nicht so wichtig nur ne kleine Übung die ich ohne das einlesesn einer Datei programmieren könnte aber da ich keine lust habe das ganze immer wieder und wieder von vorne einzugeben, wollt ichs halt über ne Datei lösen.

Also wieso ließt er nicht bzw. wieso bekomme ich immer NULL?
 
Zuletzt bearbeitet:
Erklär mir mal den Code der deine "Arbeiter.txt" ausliest. Vielleicht kommst du dann selber drauf was falsch ist, wenn dus nochmal rekapitulierst.
 
hm ... mitm FileReader erstelle ich ein neues Objekt von FileReader, die die Datei enthält, woraus es lesen soll. Mit dem BufferedReader lese ich ganze Zeilen aus. Die Schleife dient dazu, um das ArbeiterArray mit neuen Arbeitern die es aus dem Textdatei kriegt zu füllen. Die erste Ausgabe war mehr ein Test um zu gucken, ob der überhaupt was ausgibt. Soweit ich weiß gibt es NULL zurück, wenn es am Ende angelangt ist. Daher meine Vermutung, dass ich irgendwie am Ende der Datei angelangt bin ... ka... der geht ja noch nicht mal in die while-Schleife rein. Die Variable zeile sollte eigentlich die erste Zeile enthalten also eine "1" und dann vergleichen, ob es nicht null ist. Ansonsten soll der die Werte in die entsprechenden Variablen einlesen und in das Array packen. Zuletzt soll es die Datei schließen.
Oder habe ich die falschen Klassen genommen, um eine Datei auszulesen und br.readLine() enthält immer NULL, weil der keine Werte bekommt, warum auch immer?

Java:
public void mArbeiter(){
        try{
            FileReader out = new FileReader("Arbeiter.txt");
            BufferedReader br = new BufferedReader(out);
 
            String zeile = null;
            for(int i = 0; i < 5; i++){
                System.out.print(br.readLine());
                while((zeile = br.readLine()) != null){
                    personalnummer = Integer.valueOf(br.readLine());
                    //arbeiter[i].setPersonalnummer(personalnummer);
                    name =br.readLine();
                    //arbeiter[i].setName(name);
                    stundenlohn = Double.valueOf(br.readLine());
                    //arbeiter[i].setStundenlohn(stundenlohn);
                    anzahl_der_Arbeitsstunden = Double.valueOf(br.readLine());
                    //arbeiter[i].setAnzahl_der_arbeitsstunden(anzahl_der_Arbeitsstunden);
                    arbeiter[i] = new Arbeiter(personalnummer, name, stundenlohn, anzahl_der_Arbeitsstunden);
                }
            }
            br.close();
        } catch(IOException e){
            e.printStackTrace();
        }
    }
 
Warum hast du innerhalb deiner for-Schleife noch eine while-Schleife? Denke ohne die innere Schleife funktioniert das ganze schon wesentlich besser ;)

Gruß
sony2
 
this works:
Java:
package de.tutorials.johannes7146;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileRead {

    public static void main(String[] args) {
        FileReader out = null;
        BufferedReader br = null;
        try {
            out = new FileReader("Arbeiter.txt");
            br = new BufferedReader(out);
                while ((br.readLine()) != null) {
                    System.out.println("personalnummer  : " + br.readLine());
                    System.out.println("name            : " + br.readLine());
                    System.out.println("stundenlohn     : " + br.readLine());
                    System.out.println("Arbeitsstunden  : " + br.readLine());
                    System.out.println();
                }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

So kannst du auch beliebig viele Arbeiter hinzufügen. Die For-Schleife war wie bereits von SONY2 erwähnt überflüssig.
Du hattest bei deinem Beispiel in Zeile 43 immer eine Zeile ausgelesen aber nicht verarbeitet.

Das schließen von Readern,Streams, DB-Connections usw... solltest du im finally-Block machen.
So wird er auch dann geschlossen, wenn eine Exception auftritt.
 
Zuletzt bearbeitet:
na ich wollts halt nicht einfach nur ausgeben sondern das ganze soll in einem array gespeichert werden ... das problem ist ja eigentlich nur das ich keine daten von der *.txt kriege ... auch wenn ich die for-schleife weg mache gehts trotzdem nicht, weil der ja nichts bekommt ... hab ich irgendwie ne falsche klasse verwendet ?

weil nach dem Bsp. von Johannes7146 gehts auch nicht ... oder kanns vielleicht auch daran liegen, dass ich keine rechte irgendwie habe um die datei zu lesen? Oo ... ist nämlich ein firmenlaptop woran ich arbeite ...
 
Also mein Code läuft bei mir.
Du kannst ja in der schleife einfach anstatt die Daten auszugeben einen neuen Arbeiter anlegen und ihn in einem Array oder eine Collection speichern. (Ich persönlich bforzuge da meist eher eine Collection) ich hatte nur deine Arbeiter Klasse nicht und hab daher die daten einfach ausgegeben.

Wenn du keine Rechte hättest sollte eigentlich eine Exception geworfen werden.
 
Also der Code von Johannes7146 läuft einwandfrei. Überprüf doch mit
Java:
System.out.println(new java.io.File("Arbeiter.txt").exists())
mal ob deine Datei auch wirklich an der Stelle vorhanden ist, auf die du zugreifst.

Ansonsten wüsste ich auch nicht mehr woran es noch liegen kann.

Gruß
sony2
 
Also der Code von Johannes7146 läuft einwandfrei. Überprüf doch mit
Java:
System.out.println(new java.io.File("Arbeiter.txt").exists())
mal ob deine Datei auch wirklich an der Stelle vorhanden ist, auf die du zugreifst.

Ansonsten wüsste ich auch nicht mehr woran es noch liegen kann.

Gruß
sony2


ach man ... also es zeigt mir TRUE an ... hm ich probiere es später mal auf meinem anderen laptop aus ... das kann doch nicht so schwer sein -.- ....
 
uhhh ..... man man man ... die Datei wurde außerhalb der src Ordner nochmal erstellt ^^ ... ich dachte der ließt die direkt aus dem Ordern src ... naja jetzt weiß ichs besser :p ... aber jetzt kommt der Fehler hier

Java:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Peter Ganz"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.valueOf(Unknown Source)
	at Aufgabe3.Gehaltsabrechnung.mArbeiter(Gehaltsabrechnung.java:42)
	at Aufgabe3.Gehaltsabrechnung.start(Gehaltsabrechnung.java:27)
	at Aufgabe3.Main.main(Main.java:9)

aber ich denke das bekomm ich schon besser hin ^^ ... danke an alle
 

Neue Beiträge

Zurück