Fehler in java code: "illegal start of expression"

Guten Tag,

durch Autodidaktik lerne ich gerade java. Folgende Quellcode (Test.java) über ein Array

class Test {
public static void main(String[] args) {
int len = args.length;
int[] myArray = new int[len];
if(len

liefert nun 44 Fehler (z.B. „Test.java:6: illegal start of expression“), mit denen ich nicht anfangen kann.

Für Hilfe und Hinweise bedanke ich mich im voraus.
Gruss,
peter

HAllo Peter,

Du kannst diese Art der Zuweisung nur bei der Initialisierung verwenden, also
int[] myArray = {1,2,3,4};
Das hat etwas mit der Art und Weise zu tun, wie Arrays in Java implementiert sind.

Diese Stelle aus dem Insel-Buch fasst die Fakten schön zusammen:

3.8.8 Vorinitialisierte Arrays
Wenn wir in Java ein Array-Objekt erzeugen und gleich mit Werten initialisieren wollen, dann schreiben wir etwa:

int[] primi = { 2, 5, 7, 11, 13 };

Wollen wir uns erst nach der Variablendeklaration für die Feldinhalte interessieren und sie gegebenenfalls auch ändern, schlägt ein Versuch wie der folgende fehl:

int[] primi;
primi = { 2, 5, 7, 11, 13 };
ausgleichsgerade( { 1.23, 4.94, 9.33, 3.91, 6.34 } );

Zur Lösung gibt es zwei Ansätze. Die erste ist die Einführung einer neuen Variablen:

int[] primi;
int[] tmpprimi = { 2, 5, 7, 11, 13 };
primi = tmpprimi;

Dann gibt es eine Variante des new-Operators, der durch ein Paar eckiger Klammern erweitert wird. Es folgen in geschweiften Klammern die Initialwerte des Arrays. Die Größe des Arrays entspricht genau der Anzahl der Werte. Für die oberen Beispiele ergibt sich folgende Schreibweise:

int[] primi;
primi = new int[]{ 2, 5, 7, 11, 13 };
ausgleichsgerade( new double[]{ 1.23, 4.94, 9.33, 3.91, 6.34 } );

Da, wie im zweiten Beispiel, ein initialisiertes Feld mit Werten gleich an die Funktion übergeben wird und keine zusätzliche Variable benutzt wird, wird diese Art der Arrays »anonyme Arrays« genannt. Eigentlich gibt es auch sonst anonyme Arrays, wie new int[2000].length zeigt. Doch in diesem Fall wird das Feld nicht mit Werten initialisiert.

Hallo Arthur!

Schönen Dank für Deine schnelle Hilfe!
int len = args.length;
int[] myArray = new int[len];
if(len

Hallo Arthur!

Schönen Dank für Deine schnelle Hilfe!
int len = args.length;
int[] myArray = new int[len];
if(len

HaliHaloHalöle
wenn du die if abfrage weglässt dann wird das programm funktionieren. wieso haste die überhaubt dahin gemacht?? ich versteh den Sinn nicht. Wär auch schön wenn du das zukünftig ein bischen kommentieren könntest!

class Test {
public static void main(String[] args) {
int len = args.length;
int[] myArray = new int[len];
for(int i=0; i

Danke Arthur! Ich werde das OpenBook lesen.
Gruss,
peter

Danke Sven!
Als Test möchte ich ein Array ausdrucken, wenn ich die Elemente als Kommando-Parameter mit eingebe [if(args.length > 2)]. Falls ich aber vergesse, die Parameter mit einzutippen, also einfach java Test ausführe, wird nur ein „defaultes“ array ausgedruckt.
Also alles nur ein Test für mein Gelerntes übers Array, obwohl diese code auch später als Basis für das Sortieren, das Berechnen vom Minimum und Maximum dienen kann.
Gruss,
peter

guck mal hier:

class Test {
public static void main(String[] args) {
int len = args.length;
int[] myArray = new int[len];
if(len

Hi,

Der Fehler liegt in deiner Initialisierung des Arrays. So wie du es gemacht hast, funktioniert es beispielsweise in JavaScript weil es da keine Typen gibt, in Java mußt du aber den Typ des Arrays angeben.
Also anstelle von

myArray = {2,3,4,5};

muss es heissen

myArray = new int[] {2,3,4,5};

Mit freundlichem Gruß,
Kai

Dank und Gruss,
peter

Schönen Dank und Gruss,
peter

Guten Tag,

durch Autodidaktik lerne ich gerade java. Folgende Quellcode
(Test.java) über ein Array

class Test {

Bitte „public class Test“ draus machen – weil: per Konvention ist im File Test.java eine „public class Test“ drin und daran hält man sich am Besten einfach.

public static void main(String[] args) {
int len = args.length;
int[] myArray = new int[len];
if(len

liefert nun 44 Fehler (z.B. „Test.java:6: illegal start of
expression“), mit denen ich nicht anfangen kann.

Der einzige Fehler, den ich ohne Kompilieren sehen kann ist eben das int[] myArray = {1,2,3,4}; oder so – wie das richtig lautet steht ja oben und ich denke das sollte alle nachfolgenden Fehlermeldungen erklären, denn nach dieser Zeile kommt der Compiler mit Sicherheit ziemlich durcheinander, weil das überhaupt nichts entspricht, was er ansatzweise erkennen könnte :wink:

Für Hilfe und Hinweise bedanke ich mich im voraus.
Gruss,
peter

Gern geschehen, viel Spaß weiterhin beim Lernen! Und ja, man kann es in Eigenregie lernen, hab ich auch größtenteils so gemacht… :smile:

Viele Grüße,
Denis

Bitte „public class Test“ draus machen – weil: per Konvention
ist im File Test.java eine „public class Test“ drin und daran
hält man sich am Besten einfach.

Irgendwann früher (vor paar Monaten?) ging es bei mir nicht mit „public class Test“; den Fehler kann ich heute nicht mehr reproduzieren. Also halte ich mich ab heute an die Konvention.

korrekt wäre zB: myArray = new int[]{2,3,4,5};
Besser noch wäre es, wenn man die erste Initialisierung von
myArray in den else-Block schreiben würde, da man so die
Neuzuweisung im if-Block vermeiden würde – so wie’s jetzt ist
funktioniert’s schon, aber ist halt nicht „optimal“, der Code.

Der else-Block ist eben für eine andere Situation. myArray = new int[]{2,3,4,5};, was ich vorher nicht kannt, ist genau die Lösung. Das ist vielleicht typisch bei der Autodidaktik?

Bitte bei Sachen wie for, if, else etc immer einen Block
anfangen, d.h. geschweifte Klammern { und } verwenden, ist
eine beliebte Fehlerquelle sonst. Auch wenn’s nur eine
Anweisung ist, die da stehen soll…
Gehört zum guten Stil.

Ja, wohl!

Der einzige Fehler, den ich ohne Kompilieren sehen kann ist
eben das int[] myArray = {1,2,3,4}; oder so – wie das richtig
lautet steht ja oben und ich denke das sollte alle
nachfolgenden Fehlermeldungen erklären, denn nach dieser Zeile
kommt der Compiler mit Sicherheit ziemlich durcheinander, weil
das überhaupt nichts entspricht, was er ansatzweise erkennen
könnte :wink:

Exakt der Fall!

Gern geschehen, viel Spaß weiterhin beim Lernen! Und ja, man
kann es in Eigenregie lernen, hab ich auch größtenteils so
gemacht… :smile:

Viele Grüße,
Denis

Vielen Dank, Denis! Du hast mir viel geholfen.

Viele Grüße
peter

Hi Peter,

schön, dass ich helfen konnte. Noch ein paar kurze Anmerkungen.

Irgendwann früher (vor paar Monaten?) ging es bei mir nicht
mit „public class Test“; den Fehler kann ich heute nicht mehr
reproduzieren. Also halte ich mich ab heute an die Konvention.

Dann war sicher etwas anderes noch zusätzlich falsch oder Du hattest damit einen Fehler reingebracht. Beispielsweise könnte die Datei nicht „Test.java“ geheißen haben, dann würde das einen Compilerfehler ergeben. Lies einfach am Besten nochmal ein paar Infos zum Zusammenhang Sichtbarkeit von Klassen + Dateinamen.
Aber erstmal einfach daran halten und die Sache erst im Lauf der Zeit nochmal irgendwann genauer verstehen ist auch in Ordnung, ist nicht so kritisch, dieser Punkt.

Der else-Block ist eben für eine andere Situation. myArray = new int[]{2,3,4,5};, was ich vorher nicht kannt, ist genau
die Lösung. Das ist vielleicht typisch bei der Autodidaktik?

Sagen wir mal, dass diese doppelte Anweisung typisch dafür ist, wenn man an einem Stück Code viele Dinge ändert und am Ende nicht nochmal durchgeht, ob man nicht irgendwas doppelt gemoppelt hat :wink: Passiert sicher nicht nur Anfängern.

Exakt der Fall!

Wunderbar :smile:

Vielen Dank, Denis! Du hast mir viel geholfen.

Viele Grüße
peter

Bitte sehr + viel Erfolg beim Lernen weiterhin,
Denis

Dank und schönen Abend!
peter

Hi Denis!

Hier noch eine andere Frage:
20000000000F == 20000000000F+1
liefert ein true und wieso?

Ausgedruckt sehen beide Ausdrücke tatsächlich gleich aus:
2.0E10
2.0E10
Halbwegs ist das schon ein Grund. Aber man ist noch nicht damit zufrieden. Wieso ergeben sich aus 20000000000F und 20000000000F+1 trotz des Unterschieds eine gemeinsame Ergebniszahl 2.0E10?

Dank im voraus!
peter

Hi Peter,

das geht mehr in Richtung allgemeine Handhabung von Gleitkommazahlen auf Rechnern als in Richtung Java.

Ich hab wenig zu tun mit mathematischen Berechnungen in Programmen, von daher kann ich einen Tipp abgeben:
Höchstwahrscheinlich ist das ein Rundungsfehler bei der Additionsoperation. Gleitkommazahlen haben begrenzte Genauigkeit und das hast Du oben gezeigt… :smile:
Der Test von Gleitkommazahlen auf Gleichheit ist außerdem auch ein nicht immer triviales Thema, man arbeitet beispielsweise öfter mal mit einem Epsilon, d.h. man fragt nicht (f und g sind floats):

if(f == g) …

sondern

float epsilon = 0.001f;
if(Math.abs(f - g)

Hi Denis!
> mehr in Richtung allgemeine Handhabung von Gleitkommazahlen auf Rechnern als in Richtung Java.

So werde ich das Thema nicht weiter verfolgen. Wohl aber bei ähnlichen Fällen aufpassen.

Vielen Dank und schönes Wochenende!
peter

… und noch ein Punkt, den ich vergessen hatte zu erwähnen:

Wenn es keine trifftigen Gründe gibt sollte man übrigens IMMER double statt float verwenden, eben auch um gewisse Rundungs- / Berechnungsfehler nicht so häufig auftreten zu lassen.

(Ein trifftiger Grund wäre, wenn man zB diese 3 Dinge zutreffen: 1) man braucht jedes Quentchen Performance, 2) man weiß aus theoretischen Überlegungen und / oder aus praktischen Tests (Profiling), dass die Gleitkommazahlberechnungen ein Flaschenhals für die spezifische Applikation sind und 3) man sich über die geringere Genauigkeit und ihre Auswirkungen klar ist und diese keine relevanten negativen Auswirkungen auf die Effektivität der Applikation / des Algorithmus hat oder man diese anderweitig irgendwie abfangen und ggf korrigieren kann.
Hinweis: Für normale Anwendungen trifft weder 2) noch 3) zu und 1) auch in keinem angemessenen Ausmaß, von daher einfach nicht drüber nachdenken, sondern immer double verwenden. Im Zeitalter der 64 Bit Maschinen wird außerdem auch der Performanceunterschied immer weniger signifikant…)

Gruß + ebenfalls angenehmes WE,
Denis