error: <identifier> expected

Diskutiere error: <identifier> expected im Java Basics - Anfänger-Themen Bereich.
C

Conny88

Hallo zusammen
Ich möchte diesen Code hier ausführen:

Code:
class Mitarbeiter2 {   
    String m_name;           
    String m_vorname;             
    int    m_gehalt;
 
  Mitarbeiter2(String m_name, String m_vorname,
                int m_gehalt); {
    m_name = name;
    m_vorname = vorname;
    m_gehalt = gehalt;
  }
        
  void datenAusgeben() {
    System.out.println("\n");
    System.out.println(" Name : " + m_name);
    System.out.println(" Vorname : " + m_vorname);
    System.out.println(" Gehalt : " + m_gehalt + " Euro");
    }
    
  void gehaltErhoehen(int erhoehung) {
     m_gehalt += erhoehung;
  }
}

public class MitarbeiterBeispiel {
    public static void main(new Mitarbeiter("Gates","Bill",3000);
        Mitarbeiter stevie = new Mitarbeiter("Jobs","Steve",3500);
        billy.datenAusgeben();
        stevie.datenAusgeben();
        
        billy.gehaltErhoehen(500);
        
        billy.datenAusgeben();
        stevie.datenAusgeben();
    }
}
Erhalten sollte ich gemäss dem Buch "Java - eine Einführung in die Programmierung" (von Dirk Louis und Peter Müller) die Datei lm Anhang "das sollte kommen in Eingabeaufforderung".

Bei mir erscheinen aber die folgenden ERROR-Meldungen:

Code:
C:\Program Files\Java\Quellcodes\Kap03>javac MitarbeiterBeispiel.java
MitarbeiterBeispiel.java:26: error: illegal start of type
        public static void main(new Mitarbeiter("Gates","Bill",3000);
                                ^
MitarbeiterBeispiel.java:28: error: <identifier> expected
                billy.datenAusgeben();
                                   ^
MitarbeiterBeispiel.java:29: error: <identifier> expected
                stevie.datenAusgeben();
                                    ^
MitarbeiterBeispiel.java:31: error: <identifier> expected
                billy.gehaltErhoehen(500);
                                    ^
MitarbeiterBeispiel.java:31: error: illegal start of type
                billy.gehaltErhoehen(500);
                                     ^
MitarbeiterBeispiel.java:33: error: <identifier> expected
                billy.datenAusgeben();
                                   ^
MitarbeiterBeispiel.java:34: error: <identifier> expected
                stevie.datenAusgeben();
                                    ^
MitarbeiterBeispiel.java:36: error: class, interface, or enum expected
}
^

Irgendetwas (identifier -> was ist das) wird erwartet

Wisst ihr, an was das liegen könnte? Ich habe es auf x-verschiedene Arten versucht, aber ich komme seit etwa 3 Stunden nicht weiter.

Wär super, wenn ihr mir helfen könntet. :)
 

Anhänge

H

httpdigest

Da hast du an einigen Stellen den Java Code wohl falsch vom Buch abgeschrieben. Ich habe das mal korriegiert:
Java:
class Mitarbeiter { // <- Klassenname war mit "Mitarbeiter2" falsch (Mitarbeiter2 deklariert, aber als "Mitarbeiter" unten verwendet)
  String m_name;
  String m_vorname;
  int m_gehalt;

  Mitarbeiter(String m_name, String m_vorname, int m_gehalt) { // <- Konstruktor-Deklaration war falsch
    this.m_name = m_name; // <- Zuweisung war falsch
    this.m_vorname = m_vorname; // <- Zuweisung war falsch
    this.m_gehalt = m_gehalt; // <- Zuweisung war falsch
  }

  void datenAusgeben() {
    System.out.println("\n");
    System.out.println(" Name : " + m_name);
    System.out.println(" Vorname : " + m_vorname);
    System.out.println(" Gehalt : " + m_gehalt + " Euro");
  }

  void gehaltErhoehen(int erhoehung) {
    m_gehalt += erhoehung;
  }
}

public class MitarbeiterBeispiel {
  public static void main(String[] args) { // <- Signatur der main-Methode war falsch
    Mitarbeiter billy = new Mitarbeiter("Gates", "Bill", 3000); // <- fehlende Deklaration der "billy" Variable
    Mitarbeiter stevie = new Mitarbeiter("Jobs", "Steve", 3500);
    billy.datenAusgeben();
    stevie.datenAusgeben();
    billy.gehaltErhoehen(500);
    billy.datenAusgeben();
    stevie.datenAusgeben();
  }
}
 
C

Conny88

Ja, ich habe gesehen, dass ich einige Texte angepasst habe, um die ERROR-Meldung verschwinden zu lassen. ;) Sorry dafür...

Aber wie kommt man bei den Zeilen 7 - 9 auf

Code:
    this.m_name = m_name;
    this.m_vorname = m_vorname;
    this.m_gehalt = m_gehalt;
das steht nicht in meinem Buch. Es steht so in meinem Buch siehe Anhang.

Im Buch steht es so:
Code:
  Mitarbeiter(String name, String vorname, int gehalt) {  //-> ohne das "m_" wie in deinem bzw. meinem Code
    m_name = name;
    m_vorname = vorname;
    m_gehalt = gehalt;
  }
Was heisst das "this"?

Vielen Dank für deine Hilfe. :)
 

Anhänge

H

httpdigest

`this` bedeutet "diese Instanz". Wann immer du eine Instanzvariable oder eine Instanzmethode referenzierst, kannst du dir ein implizites `this.` davor denken. Das war dort nötig, da deine Konstruktorparameter in deinem ersten Post genauso hießen wie deine Instanzvariablen (beide hießen "m_name", "m_vorname" und "m_gehalt").
Das `this` dient dazu, im einen Fall die Instanzvariable zu meinen.

Würde man also z.B. nur schreiben:
Java:
Mitarbeiter(String m_name, String m_vorname, int m_gehalt) {
  m_name = m_name;
  m_vorname = m_vorname;
  m_gehalt = m_gehalt;
}
dann wären das Zuweisungen auf dieselben Parameter und nicht auf die Instanzvariablen.

Das ganze kann man natürlich auch umgehen, indem man eben die Parameter nicht so nennt wie die Instanzvariablen, wie du es in deinem letzten Post getan hast.
 
mihe7

mihe7

@Conny88 Übrigens: der Präfix "m_" wird in der ungarischen Notation dazu verwendet, Instanzvariablen (sog. Member, daher das m) zu kennzeichnen. Dagegen stünde der Präfix "p_" für einen Parameter. Entsprechend angewandt müsste der Konstruktor also lauten:
Java:
Mitarbeiter(String p_name, String p_vorname, int p_gehalt) {
    m_name = p_name;
    m_vorname = p_vorname;
    m_gehalt = p_gehalt;
}
Über Sinn und Unsinn dieser Notation lässt sich streiten, in dieser Form widerspricht sie aber den Benennungskonventionen von Java. Benenne die Variablen wenigstens in lowerCamelCase.
 
C

Conny88

Hallo zusammen
Vielen Dank für eure Hilfe. :)

Etwas ist mir noch unklar:
Wieso nennt man die drei "m_name", "m_vorname" und "m_gehalt" nicht von Anfang an nur "name", ... ohne das m davor?

Ich hätte es eher so gemacht:

Code:
class Mitarbeiter {   
    String name;           
    String vorname;             
    int    gehalt;
 
  Mitarbeiter(String name, String vorname, int gehalt) {
  name;
  vorname;
  gehalt;
  }
        
  void datenAusgeben() {
    System.out.println("\n");
    System.out.println(" Name : " + name);
    System.out.println(" Vorname : " + vorname);
    System.out.println(" Gehalt : " + gehalt + " Euro");
    }
    
  void gehaltErhoehen(int erhoehung) {
     gehalt += erhoehung;
  }
}

public class MitarbeiterBeispiel2 {
public static void main(String[] args) {
    
    Mitarbeiter billy = new Mitarbeiter("Gates", "Bill", 3000);
        Mitarbeiter stevie = new Mitarbeiter("Jobs", "Steve", 3500);
        billy.datenAusgeben();
        stevie.datenAusgeben();
        billy.gehaltErhoehen(500);
        billy.datenAusgeben();
        stevie.datenAusgeben();
    }
}

Hier kommt folgende ERROR-Meldung:

Code:
C:\Program Files\Java\Quellcodes\Kap03>javac MitarbeiterBeispiel2.java
MitarbeiterBeispiel2.java:7: error: not a statement
  name;
  ^
MitarbeiterBeispiel2.java:8: error: not a statement
  vorname;
  ^
MitarbeiterBeispiel2.java:9: error: not a statement
  gehalt;
  ^
3 errors

Was meint man hier mit "keine Stellungnahme"?
 
C

Conny88

Ist der Grund, weil wir aus einer Instanzvariablen einen Parameter benötigen, damit er angezeigt wird beim Ausführen?
 
T

thecain

Willst du nicht nochmal die Grundlagen lesen? Offenbar haben die oberen Beiträge nicht geholfen...

Not a statement ist nicht 1 zu 1 zu übersetzen...
 
H

httpdigest

Du hast einfach nur die drei Zeilen:
Java:
  name;
  vorname;
  gehalt;
in den Body deines Konstruktors geschrieben. Was meinst du denn, sollten diese drei Zeilen bewirken?
Statement = Anweisung.
"Not a statement" bedeutet: "Das ist keine Anweisung (im Sinne von Java)".
 
J

JustNobody

Etwas ist mir noch unklar:
Wieso nennt man die drei "m_name", "m_vorname" und "m_gehalt" nicht von Anfang an nur "name", ... ohne das m davor?
Also nur zu der Frage kurz: Genau so ist die "übliche" Vorgehensweise in Java. So wie @mihe7 es in #5 angedeutet hat: Es gibt diverse Notationen. Die in Java übliche ist, dass man bei Variablen keine Präfixe verwendet. Damit sollten Variablen und Parameter einfach nur den Namen haben, der sie bezeichnet.
==> name, vorname, gehalt.

Wenn man aber andere Notationen anschaut, dann findet man oft Präfixe. @mihe7 hat hier dann bei der ungarischen Notation das m_ und p_ genannt. (m für Member und p für Parameter). Das ist aber nur extrem einfach - bei C/C++ wird das mit dem Typ genauer gemacht, also dann hat man z.B. pszBuffer -> Der Name soll buffer sein und es ist ein Zeiger (pointer: p) zu einer Zeichenkette (String: s) die mit einem 0-Wert termininiert ist (Zero: z) -> pszBuffer.

Aber wie gesagt: In Java ist der Standard eigentlich so, dass gar kein Präfix verwendet wird! Also wirklich nur name, vorname, gehalt.

Und die Grundlagen, die Du Dir genau ansehen solltest - einmal in Kürze dargestellt:

Java:
// Eine Klasse Test
public class Test {
    private String name; // Eine Instanzvariable vom typ String mit Namen "name".
    
    public void someMethod() {
        name = ""; // Zugriff auf die Instanzvariable "name"
        this.name = ""; // Wie oben, das this. ist optional.
    }
    
    public void someMethod(String name) {
        // Der Parameter name "versteckt" nun die Instanzvariable name.
        
        this.name = name; // this.name ist die Instanzvariable, name der Parameter!
        
        name = ""; // Dies setzt nicht die Instanzvariable auf "" sondern den Parameter! (Macht natürlich so keinen Sinn und ist nur zur Erläuterung angegeben.)
    }
}
Also was Du Dir in Deinen Unterlagen / in einem Buch noch einmal im Detail ansehen solltest ist:
- Variablen: Wie werden diese Deklariert? Wo kann man diese deklarieren? Und der Gültigkeitsbereich von Variablen.
- dieses "verstecken" einer Instanzvariable durch Parameter oder lokale Variablen!
 
mihe7

mihe7

Da war @JustNobody mal wieder schneller. Hinzufügen könnte man noch, dass

a) die Notation ihren Ursprung tatsächlich in C/C++ haben dürfte (lt. Wiki-Artikel wurde sie ja von einem ungarischen Microsoft-Mitarbeiter ursprünglich für die Entwicklung von Office entwickelt und dann für ganz Windows übernommen.) Dort macht die Notation auch wesentlich mehr Sinn, da man viel mehr Typen, globalen Variablen etc. zu unterscheiden hat.

b) unter Android ebenfalls diese Notation verwendet wird. Hintergrund ist, dass die Android-Entwickler nicht aus der Java- sondern ebenfalls aus der C/C++-Ecke kamen, genauer gesagt https://beust.com/weblog/2017/07/17/i-am-the-reason-for-hungarian-notation-in-android/ :)
 
M

M.L.

Noch kurz zur ungarischen Notation: man sollte eine Variable (für einen Menschen) sinnvoll benennen, siehe Erklärung für pszBuffer. In C++ ist eine Variable/Parameter/Methode aber gerade _nicht_ zwingend Member ( "m_ ") einer Klasse (im Ggs. zu Java) und Speichermanipulationen (Pointer/Referenzen) wie in C++ sind in Java auch nicht möglich.
 
T

temi

Und die Grundlagen, die Du Dir genau ansehen solltest - einmal in Kürze dargestellt:

Also was Du Dir in Deinen Unterlagen / in einem Buch noch einmal im Detail ansehen solltest ist:
- Variablen: Wie werden diese Deklariert? Wo kann man diese deklarieren? Und der Gültigkeitsbereich von Variablen.
- dieses "verstecken" einer Instanzvariable durch Parameter oder lokale Variablen!
Ergänzend zu den sehr schönen Erläuterungen von @JustNobody noch

Java:
    public void someMethod(String name) { // hier wird eine Variable vom Typ String mit dem Namen name deklariert
        // Der Parameter ist also auch nur eine Variable und zwar eine lokale Variable, die nur innerhalb der Methode gültig ist.
        // Der Parameter name "versteckt" nun die Instanzvariable name.
        
        this.name = name; // this.name ist die Instanzvariable, name der Parameter!
        
        name = ""; // Dies setzt nicht die Instanzvariable auf "" sondern den Parameter! (Macht natürlich so keinen Sinn und ist nur zur Erläuterung angegeben.)
    } // an dieser Stelle endet die Gültigkeit der Variablen / des Parameters "name"
 
C

Conny88

Ich habe mir die Theorie des Konstruktors, der Variablen und des Parameters nochmals durchgelesen und verstehe, dass es überhaupt keinen Sinn macht, nur "name", "vorname" und "gehalt" zu schreiben. :rolleyes:

Es fällt mir sehr schwer, ohne Vorwissen das Buch "Java - eine Einführung in die Programmierung" zu verstehen. Daher werde ich die Theorie in Zukunft mehrmals durchlesen, da ich länger benötige um es zu verstehen.

Mit euren Erklärungen ist es mir beim nochmaligen Lesen aber viel leichter gefallen. :)

Daher bedanke ich mich nochmals bei allen für eure Geduld und Erklärungen. :)
 
Thema: 

error: <identifier> expected

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben