# <identifier> expected



## Kel (20. Apr 2011)

```
import java.awt.Color;

public class Auto {

	String marke;
	String klasse;
	float preis; // in €
	int baujahr;
	Color farbe;
	int ps;
	int tueren; // Anzahl der T&uuml;ren
	int aktuelleGeschwindigkeit;
	int hoechstGeschwindigkeit; // in km/h
	int zurueckgelegteStrecke;
	int emission = 13; //in Gramm CO2 pro Kilometer
	boolean gruenePlakette;
	boolean gueltigerTuev;

        int beschleunigung = 12;
	int geschwindigkeit = 0; 
	geschwindigkeit = geschwindigkeit + beschleunigung;
	System.out.println(geschwindigkeit);
	
	public Auto() {
		// Beispiel: 
		System.out.println("Beispiel: ");
		gueltigerTuev = false;
		System.out.println(gueltigerTuev);
		gueltigerTuev = true;
		System.out.println(gueltigerTuev);
        }

	public static void main(final String arg[]) {
		new Auto();
	}
}
```

Genaue Fehlermeldung


> Auto.java:64: <identifier> expected
> geschwindigkeit = geschwindigkeit + beschleunigung;
> ^
> 1 error


Zeilenangaben stimmen zwar nicht, weil ich alles unnötige rauskopiert habe, aber die Fehlermeldung ist ja recht eindeutig. Nur leider kapier ich das nicht.

Google sagt mir was von


> Der angezeigte Fehler rührt aber daher, dass Du versuchst, Code, der so nur in einer Methode vorkommen darf, direkt im Klassenzusammenhang auszuführen. So kannst Du zwar einer definierten Variable direkt bei der Initialisierung einen Wert mitgeben (wie bei String s = "Hallo"), aber nicht erst definieren und dann später ausserhalb einer Methode zuweisen (int b; b = 1; geht nicht).
> 
> Wenn Du Klassenvariablen gleich bei der Erzeugung initialisieren willst, muss Du das entweder bei deren Deklaration oder im Konstruktor machen:



Nur ist das für mich als ziemlicher Javaeinsteiger doch etwas .... verwirrend.
Kann mir da jemand helfen?


----------



## Volvagia (20. Apr 2011)

Hat mich auch verwirrt. :autsch:
Du kannst außerhalb einer Methode einer bereits deklarieren Variable keinen anderen Wert zuweißen. Und ein System.out.println geht dort erstrecht nicht.

Für Geld sollte man übrigens keine Gleitkommazahlen verwenden. (Ungenau) Lieber Ganz und in Cent.


----------



## Kel (20. Apr 2011)

Das würde erklären, weshalb es funktioniert, wenn ich es einkapsel.


```
void Aufgabe2_6() {
	// Das Auto hat eine Beschleunigung von 12km/h pro Sekunde.
	//Die Geschwindigkeit in einer Sekunde erhöht sich um die Beschleunigung
		int beschleunigung = 12;
		int geschwindigkeit = 0; 
		geschwindigkeit = geschwindigkeit + beschleunigung;
		System.out.println(geschwindigkeit);
	}
```

Wie ich das void-Ding wieder aufrufe, um mein System.out.println() zu kriegen, weiss ich bisher aber noch nicht .

Ach, die Programmierkonvention, dass Geld wegen Rundungsfehlern immer in Centeinheiten als Ganzzahlen verwendet werden? Das werden aber recht große Zahlen, naja egal.
Also "int preis" statt "float preis"?


----------



## anfangs (20. Apr 2011)

Sieh dir mal an, in welcher Reihenfolge eine Programm gestartet wird, also erst statische Variablen usw., dann main(). Code, der nicht diesem Schema genügt, kann auch nicht abgearbeitet werden. Anweisungen außerhalb von Methoden, außer Deklarationen usw., zählen dazu. Also entweder oder..


----------



## Volvagia (20. Apr 2011)

Das ist kein Void-Ding, sondern eine Methode.
Einfach "Aufgabe2_6();" schreiben. Allerdings wirst du die Variable immer neu erzeugen, sie wird erneut auf 12 gesetzt und das ausgegeben. Schau dir doch erstmals die Basics an.

Um jede Sekunde um 12 zu beschleunigen, brauchst du einen Thread oder einen Timer. Alternativ auch so einen SwingWorker, den ich aber nur vom Lesen kenne.

Übrigens schreibt man Methoden immer klein und Camcelcase, sonst gibt es später Probleme.

Edit: float/double kann nicht alle Zahlen genau darstellen. Deshalb wäre es sicherer. int kann bis ca. 2 Milliarden, was über 20 Millionen Euro wären.


----------



## Kel (20. Apr 2011)

Die Grundlagen werden aktuell ja erst unterrichtet, ich halte mich im Gegensatz zum Rest noch wacker, die schaffen es teilweise nichtmal, das JDK richtig zu installieren.

Okay, grade nochmal in mein Skript geschaut.
Also, es gibt eine Startklasse, welche die main()-Methode beinhaltet. Die main()-Methode wird immer als erstes von der JVM aufgerufen und die darin enthaltenen Funktionen ausgeführt.

Im Beispiel oben ist die Startklasse "public class Auto" und beinhaltet somit die "public static void main(final String arg[])". Diese ruft "new Auto();" auf, und da hab ich keine Ahnung, was das Ding macht, dass hatten wir noch nicht :rtfm:.

Innerhalb der "public class Auto" kann ich jetzt meine Methoden definieren mit methodenname().
Sowas wie Threads oder Timer sind wohl noch leider etwas entfernt, geht recht langsam voran.

Bleiben noch 3 Fragen (sofern der Rest da oben richtig ist): 
1: wie führe ich z.B. Aufgabe2_6 so aus, dass ich eine Ausgabe auf der Konsole habe? Methoden haben wir noch nicht wirklich behandelt, nur kurz angeschnitten im Skript als Bestandteil der Javastruktur.
2: was tut "public class Auto"
3: was tut "new Auto();"


----------



## Volvagia (20. Apr 2011)

New Auto erzeugt ein neues Auto.
public class Auto ist der Konstruktor des Autos, dieser wird immer abgearbeitet, wenn ein neues Auto erzeugt wird.
Entwerder in der Main


```
Auto auto = new Auto();
auto.Aufgabe2_6();
```

Oder im Konstruktor


```
Aufgabe2_6();
```


----------



## Kel (20. Apr 2011)

Also ist "publich class Auto" sowas wie die Haupt-Autoklasse mit globalen Variablen und mit der Bildung neuer Instanzen über "New Auto()" erzeugt man eine neue Instanz der Klasse Auto, welche alle globalen Eigenschaften ihrer Klasse hat, man aber in der erzeugten Instanz noch beliebige Sachen ändern kann?

Wenn ich

```
public static void main(final String arg[]) {
	new Auto();
	Auto auto = new Auto();
	auto.Aufgabe2_6();
	}
```
schreibe, gibs direkt eine Exception



> Exception in thread "main" java.lang.NullPointerException
> at Auto.<init>(Auto.java:19)
> at Auto.main(Auto.java:134)


----------



## faetzminator (20. Apr 2011)

Es würde uns vielleicht helfen, wenn du uns mitteilen würdest, was denn auf Zeile 134 und ggf. davon abhängigen Zeilen steht


----------



## Kel (20. Apr 2011)

Okay, dann hau ich mal den kompletten Code hier rein, anscheinend gibs hier aber keine Spoilertags, wird also recht lang.
Sofern man die "void Aufgabe2_x()" Sachen entfernt, gibt es den beschriebenen Fehler beim kompilieren.


```
import java.awt.Color;

public class Auto {

	String marke;
	String klasse;
	int preis; // in €
	int baujahr;
	Color farbe;
	int ps;
	int tueren; // Anzahl der T&uuml;ren
	int aktuelleGeschwindigkeit;
	int hoechstGeschwindigkeit; // in km/h
	int zurueckgelegteStrecke;
	int emission = 13; //in Gramm CO2 pro Kilometer
	boolean gruenePlakette;
	boolean gueltigerTuev;
	boolean Aufgabe1_1 = farbe == Color.green;
	boolean Aufgabe1_2 = marke.equals("Nissan") && !marke.equals("Golf");
	boolean Aufgabe1_3 = baujahr > 2000;
	boolean Aufgabe1_4 = gruenePlakette == true && gueltigerTuev == true;
	boolean Aufgabe1_5 = tueren == 3 || tueren == 5;
	boolean Aufgabe1_6 = (baujahr > 2008 && gruenePlakette == true && klasse == "Kleinwagen");
	boolean Aufgabe1_7 = (ps % 2 == 0);
	boolean Aufgabe1_8 = tueren <= 3 && hoechstGeschwindigkeit >= 250;
	boolean Aufgabe1_9 = hoechstGeschwindigkeit >= ps * 1.8;
	boolean Aufgabe1_10 = (preis > 1500000 && preis < 2500000) && (!klasse.equals("Kleinwagen")) || (klasse.equals("Kleinwagen") && farbe == Color.red && marke.equals("VW") && baujahr < 1978);
	
	void Aufgabe2_1() {
	//Es handelt sich um einen Ökowagen, falls die Emission unter 120 Gramm CO2 pro Kilometer liegt: 
		boolean oekowagen = emission < 120;
		System.out.println(oekowagen);
	}
	
	void Aufgabe2_2() {
	// Dreitürer haben drei Türen: 
		boolean dreituerer = tueren == 3;
		System.out.println(dreituerer);
	}
	
	void Aufgabe2_3() {
	// Das Auto hat keine 200 PS: 
		boolean x = ps != 200;
		System.out.println(x);
	}
	void Aufgabe2_4() {
	// Das Auto hat einen 4.2 Liter Motor:
		double motor = 4.2; 
		System.out.println(motor);
	}
	
	void Aufgabe2_5() {
	// Das Auto kostet unter 20.000€ und ist gelb oder grün: 
		boolean niceCar = preis < 2000000 && (farbe == Color.yellow || farbe == Color.green);
		System.out.println(niceCar);
	}
	
	void Aufgabe2_6() {
	// Das Auto hat eine Beschleunigung von 12km/h pro Sekunde.
	//Die Geschwindigkeit in einer Sekunde erhöht sich um die Beschleunigung
		int beschleunigung = 12;
		int geschwindigkeit = 0; 
		geschwindigkeit = geschwindigkeit + beschleunigung;
		System.out.println(geschwindigkeit);
	}
	
	void Aufgabe2_7() {
	// Das Auto ist ein Golf: 
		String modell = "Golf";
		System.out.println(modell);
	}

	void Aufgabe2_8() {
		// Das Auto wurde zwischen 1998 und 2000 gebaut: 
		boolean guterJahrgang = baujahr > 1998 && baujahr <= 2000;
		System.out.println(guterJahrgang);
	}
	
	void Aufgabe2_9() {
		// Der Preis des Auto lässt sich glatt durch 36 teilen: 
		boolean ratenZahlung = preis % 36 == 0;
		System.out.println(ratenZahlung);
	}
	
	void Aufgabe2_10() {
		// Aufgrund eines Angebotes verringert sich der Preis des Autos 
		int preis = 3000000; 
		int nachlass = 500000;
		preis -= nachlass;
		System.out.println(preis);
	}
	
	public Auto() {
		// Beispiel: 
		System.out.println("Beispiel: ");
		gueltigerTuev = false;
		System.out.println(gueltigerTuev);
		gueltigerTuev = true;
		System.out.println(gueltigerTuev);
	}

	void gas() {
		if (aktuelleGeschwindigkeit <= hoechstGeschwindigkeit - 30) {
			aktuelleGeschwindigkeit += 1;
		}
	}
	
	void bremsen() {
		if (aktuelleGeschwindigkeit > 0) {
			aktuelleGeschwindigkeit -= 1;
		}
	}

	void vollbremsung() {
		aktuelleGeschwindigkeit /= 2;
	}
	
	void eineStundeFahrt() {
		zurueckgelegteStrecke += aktuelleGeschwindigkeit;
	}
	
	void bisherigeEmission() {
		emission *= zurueckgelegteStrecke;
		if (emission > 1000 && emission < 10000) {
			emission /= 1000;
		}
		else {
			emission /= 10000;
		};
		
	}

	public static void main(final String arg[]) {
		new Auto();
		Auto auto = new Auto();
		auto.Aufgabe2_6();
	}

}
```


----------



## Volvagia (20. Apr 2011)

Die Variable Marke zeigt zu dem Zeitpunkt ja noch auf kein Objekt, deshalb kannst du keine Instanzmethoden aufrufen.

Mit

```
new Auto();
Auto auto = new Auto();
auto.Aufgabe2_6();
```

erzeugst du jetzt aber 2 Autos. Wenns im richtigen Leben nur auch so einfach gehen würde. Unsere ganze Wirtschaft wäre im Eimer, aber keiner müsste mehr zu Fuß gehen.


----------



## Kel (20. Apr 2011)

Volvagia hat gesagt.:


> Die Variable Marke zeigt zu dem Zeitpunkt ja noch auf kein Objekt, deshalb kannst du keine Instanzmethoden aufrufen.


Und jetzt nochmal für Leute, die 3 Vorlesungen Java hatten und grade bei den Schleifentypen angekommen sind :rtfm:.


----------



## Volvagia (20. Apr 2011)

Objektvariablen (also alles außer primitive Dateitypen wie int, long, double, char etc.) sind quasi nur Speicheradressen die sagen, wo das Objekt zu finden ist. Nach der Deklaration, wenn ihnen da nichts zugewiesen wird, zeigen sie auf garnichts (null).
Damit sie auf etwas zeigen, musst du zuerst das Objekt erzeugen (Anführungszeichen bei Strings, new bei den meisten anderen Zeug) und ihnen zuweisen. (=)
Erst dann können Instanzmethoden aufgerufen werden, denn wenn nichts da ist, kann er auch garnichts aufrufen.


----------



## Michael... (20. Apr 2011)

Kel hat gesagt.:


> Und jetzt nochmal für Leute, die 3 Vorlesungen Java hatten und grade bei den Schleifentypen angekommen sind :rtfm:.


Für nicht Informatiker: Die Variable ist "leer".


----------



## anfangs (20. Apr 2011)

Kel hat gesagt.:


> Und jetzt nochmal für Leute, die 3 Vorlesungen Java hatten und grade bei den Schleifentypen angekommen sind :rtfm:.



Was ist denn das ziel des ganzen oder die Aufgabenstellung? Man kann doch jetzt schlecht alles erklären, was Fehler im obigen Code mit sich bringen. Vielleicht ist es sinnvoll, das Vorlesungsmanuskript durchzulesen, vielleicht ist es sinnvoll, Sekundärliteratur zu lesen. Oder geht es nur darum, warum "<identifier> expected" ausgeben wird??


----------



## Kel (20. Apr 2011)

anfangs hat gesagt.:


> Was ist denn das ziel des ganzen oder die Aufgabenstellung? Oder geht es nur darum, warum "<identifier> expected" ausgeben wird??


Darum ging es mir erstmal. Aktuell sind unsere Tutoren wohl schon froh, wenn wir auf der Kommandozeile compilieren können, Zuweisungs- und Vergleichsoperator nicht durcheinanderbringen und wissen, dass es verschiedene Datentypen gibt.
Aber dass genügt mir soweit nicht, darum wollte ich etwas tiefer in die Materie für ein besseres Verständnis, was ich da eigentlich mache.

Ich werd mir die Tage mal "Java ist auch eine Insel" anschauen, ist ja gratis. Hoffentlich beantwortet dass meine Grundlagenfragen auf einer zugänglicheren Basis, als direkt mit den Fachwörtern hier konfrontiert zu werden. Die kommen dann nach den Grundlagen dran.


----------



## Volvagia (21. Apr 2011)

Schau dir mal Java in 21 Tagen an. Wird hier eher empfohlen, was ich so mitgekriegt habe. Insel wird hier eher nur als Nachschlagewerk betrachtet. Hab damit aber keine Erfahrung, hab die Basics schon von PHP gekonnt, und den meisten Rest durch Try and fail, and try again and fail again, and try again... und ab und zu fragen herausgefunden, bzw. finde es noch immer heraus. ^^


----------



## anfangs (21. Apr 2011)

Kel hat gesagt.:


> Ich werd mir die Tage mal "Java ist auch eine Insel" anschauen, ist ja gratis. Hoffentlich beantwortet dass meine Grundlagenfragen auf einer zugänglicheren Basis, als direkt mit den Fachwörtern hier konfrontiert zu werden. Die kommen dann nach den Grundlagen dran.



eine gute wahl 

und viel Erfolg bei den Studien.

Anmerkung: hör' nicht auf vagia, denn das eignet sich, um es komplett zu lesen.


----------



## Crian (21. Apr 2011)

Ich kenne Java in 21 Tagen nicht, daher fehlt mir der Vergleich, aber ich fand die Insel gut, zum lernen und auch zum Nachschlagen. Ich hab mir auch einen dicken Wälzer gekauft (Handbuch der Javaprogrammierung) aber kam damit nicht so gut klar.


----------

