Frage von snipesss, 80

Java IDE zeigt keine Fehler, trotzdem kann Programm nicht starten?

Erste Klasse:

import static java.lang.System.out;

public class Mitarbeiter {

private String name;
private String funktion;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getFunktion() {
    return funktion;
}
public void setFunktion(String funktion) {
    this.funktion = funktion;
}

public void zahleGehalt(double betrag) {
    out.printf("Zahlen Sie an %s ", name);
    out.printf("(%s) ***", funktion);
    out.printf("%, .2f Euro\n", betrag);
}

}

Zweite Klasse:

import java.util.Scanner;
import java.io.File;
import java.io.IOException;

public class Gehaltsabrechnung4 {
    public static void main(String args[])
                                throws IOException {
    Scanner diskScanner = 
            new Scanner(new File("EmployeeInfo.txt"));
    
    for(int empNum = 1; empNum <= 3; empNum++){
        bezahleMitarbeiter(diskScanner);
    }
    
    diskScanner.close();

}

static void bezahleMitarbeiter(Scanner aScanner) {
    Mitarbeiter einMa = new Mitarbeiter();
    
    einMa.setName(aScanner.nextLine());
    einMa.setFunktion(aScanner.nextLine());
    einMa.zahleGehalt(aScanner.nextDouble());
    aScanner.nextLine();
}
}

Fehlermeldung:

Exception in thread "main" java.io.FileNotFoundException: EmployeeInfo.txt (Das     
System kann die angegebene Datei nicht finden)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Gehaltsabrechnung4.main(Gehaltsabrechnung4.java:9)

[Java Eclipse Neon zeigt keine Fehler im Code an, funktioniert trotzdem nicht]

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von ceevee, 59

Mein erster Ansatzpunkt anhand der Fehlermeldung wäre die Datei "EmployeeInfo.txt" - existiert die Datei, liegt sie neben der ausführbaren Datei?

Kommentar von snipesss ,

Der Befehl "new File" erstellt sie ja oder?

Kommentar von ceevee ,

Schmeiß den Windows-Explorer (oder wie dein Dateimanager heißt) an, schau ins Projektverzeichnis und guck dort, ob die Datei da ist - dann weißt du es.

Der Konstruktor "new File()" erzeugt ein neues File-Objekt, aber nicht die Datei selbst. Mit file.createNewFile() würdest du die Datei anlegen, siehe den Link von Copyyy. 

Unabhängig davon wäre es aber sinnlos, die Datei an der Stelle zu erzeugen, denn wenn du die Datei nur anlegst, dann ist sie leer. Mit der Schleife, die als nächstes kommt, willst du anscheinend irgendwas aus der Datei auslesen - also muss da irgendwas drin stehen.

Kommentar von ceevee ,

Davon mal abgesehen solltest du dein Buch aufmerksamer lesen. In "Java für Dummies" steht auch, dass du die Datei "employees.txt" vorher anlegen musst. 

http://www.dummies.com/how-to/content/java-working-with-disk-files.html

https://books.google.de/books?id=gdpXBAAAQBAJ&pg=PT186&lpg=PT186&dq=...(Scanner+aScanner)&source=bl&ots=6EPNRof0fI&sig=79uWse2X9eX8O-NaUeqZC43-O04&hl=de&sa=X&ved=0ahUKEwjI2b_3_KLOAhViLsAKHY7aCB0Q6AEIHjAA#v=onepage&q=static%20void%20bezahleMitarbeiter(Scanner%20aScanner)&f=false

Kommentar von snipesss ,

Ich habe eine Datei mit dem Name 'EmployeeInfo.txt' schon erstellt. Nur ich weiß nicht wo ich sie speichern soll..

Kommentar von ceevee ,

Die muss in das gleiche Verzeichnis wie die ausführbare Java-Datei, die du mit Eclipse erzeugst. Hast du schonmal darüber nachgedacht, die Datei einfach innerhalb des Projektverzeichnes hin- und herzukopieren, bis das Programm läuft?

Kommentar von snipesss ,

Hab ich, jedoch erscheint jetzt eine andere Fehlermeldung:

    Exception in thread "main" java.util.NoSuchElementException: No     line found
    at java.util.Scanner.nextLine(Unknown Source)
    at                              Gehaltsabrechnung4.bezahleMitarbeiter(Gehaltsabrechnung4.java:2    3)
     at Gehaltsabrechnung4.main(Gehaltsabrechnung4.java:12)

Kommentar von ceevee ,

Lass mich raten: deine employees.txt ist eine leere Datei?

Mit den aScanner-Befehlen hier liest du zeilenweise zwei Zeichenketten (Strings) und danach eine Zahl ein.

 einMa.setName(aScanner.nextLine());
einMa.setFunktion(aScanner.nextLine());
einMa.zahleGehalt(aScanner.nextDouble());
aScanner.nextLine();

Die Datei muss also ungefähr so aufgebaut sein:

https://github.com/MigrenusMaximus/learning-java/blob/master/Dummies/employees.t...

Irgendwie hab ich den Eindruck, dein Buch erklärt Java nicht richtig...

Kommentar von snipesss ,

Die Datei ist nicht leer, sie besteht aus nur einer Zeile.

Kommentar von snipesss ,

Ich habe das in deinem Link kopiert und in die datei eingefügt. Jetzt erscheint eine weitere Fehlermeldung: :D

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at Gehaltsabrechnung4.bezahleMitarbeiter(Gehaltsabrechnung4.java:24)
at Gehaltsabrechnung4.main(Gehaltsabrechnung4.java:12)

Kommentar von 1frozenice1 ,

Nein damit erzeugst du nur ein neues File Objekt. Wenn du die Datei erzeugen willst kannst du die createNewFile Methode aufrufen. https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile()

Antwort
von Copyyy, 49

Damit das funktioniert, muss die Datei bereits vorhanden sein. Hier ein Beispiel, wie du checken kannst, ob die Datei bereits existiert oder nicht:
https://www.mkyong.com/java/how-to-create-a-file-in-java/

Keine passende Antwort gefunden?

Fragen Sie die Community