Philipp Grashoff: Java-Newbie braucht Hilfe...

Hi all,

ich sitze vor einer popligen Aufgabe, die ich in PhP schon längst gelöst haette... es muss halt aber in Java sein, Informatiklehrer sind streng ;)

Also: Ich muss einfach n Array mit 20 Zufallszahlen kreieren und die groeßte rausfinden, also so ziemlich das einfachste, was man sich vorstellen kann... ich blicks trotzdem nicht, ich bekomme immer 2 Fehlermeldungen, bei deren Interpretation ich versage:

Hier der Code:

import java.applet.*;

public class Move extends Applet
{
 public void init()
 {
 setBackground(Color.black);
 }

Label inhalt = new Label();

int l = 0;
 int args[] = {};

for (int i=0;i<20;i++) {
  args[i] = math.random();
  if(i>0) {
   if(args[i-1] < args[i]) {
    l = i;
   }
  }
 }

inhalt.setText("Das Feld" + l + "hat den größten Wert, nämlich" + args[l]);
}

und dazu die beiden Fehlermeldungen:

D:\Programme\jdk\informatik\Move.java:17: illegal start of type
 for (int i=0;i<20;i++) {
        ^
D:\Programme\jdk\informatik\Move.java:26: <identifier> expected
 inhalt.setText("Das Feld" + l + "hat den größten Wert, nämlich" + args[l]);
                                                                                  ^

Kann mir vielleicht kurz jemand sagen, was der Compiler von mir willß

Thx im Voraus

MFG

Philipp

  1. Hallo!
    Falsch:

    int args[] = {};

    Richtig:
    int args[] = new int[0];

    oder

    int args[] = new int[] {};

    Dadurch kommt der Fehler in der for-Anweisung.
    Versuch's nochmal. Vielleicht verschwindet der zweite Fehler dann von alleine.

    1. Hi Markus,

      vielen Dank fuer die Antwort, leider lags aber nicht daran... ich hab die Array-Deklaration auch mal komplett rausgeschmissen, kamen die gleichen Fehlermeldungen...

      MFG

      Philipp

      1. Hallo!
        Ja, jetzt weiß ich warum:
        Die Anweisungen müssen in einer Methode stehen. Bei dir hängen sie ein wenig in der Luft. Einfach so in die Klasse geht nicht.
        Also ein

        public void run()

        drum und nochmal probieren:

        import java.applet.*;

        public class Move extends Applet
        {
         public void init()
         {
         setBackground(Color.black);
         }

        public void run() {
         Label inhalt = new Label();

        int l = 0;
         int args[] = new int[]{};

        for (int i=0;i<20;i++) {
          args[i] = math.random();
          if(i>0) {
           if(args[i-1] < args[i]) {
            l = i;
           }
          }
         }

        inhalt.setText("Das Feld" + l + "hat den größten Wert, nämlich" + args[l]);
        }
        }

        1. Und weiter geht's:

          math.random gibt's nicht.
          Math.random wäre korrekt.

          Label kann der Compiler nicht finden, weil du vergessen hast, das Packet java.awt.* zu importieren. Wenn ich das bei mir ändere, wird zumindest anstandslos kompiliert.

        2. Hallo,

          Falsch:

          int args[] = new int[]{};

          Korrekt:
          int args[] = new int[20];

          Sonst gibt es eine ArrayIndexOutOfBoundsException während der Ausführung.
          (Läßt sich das obenstehende überhaupt kompilieren?)

          Gruß
          Slyh

          1. Hi Slyh,

            genau das Problem habe ich immernoch, obwohl ich den Array jetzt so deklariert habe... und zwar net beim Kompilieren, sondern beim Anzeigen im Browser...

            So siehts mittlerweile aus, kann den Logikfehler einfach net finden..

            import java.awt.*;
            import java.math.*;
            import java.applet.*;

            public class Move extends Applet
            {
            public void init()
             {
             setBackground(Color.black);

            Label inhalt = new Label ("", Label.CENTER);

            int l = 0;
             long args[] = new long[21];
             double x = 0;

            for (int i=0;i<20;i++) {
              x = Math.random() * 100000;
              args[i] = Math.round(x);
              if(i>0) {
               if(args[i-1] < args[i]) {
                l = i;
               }
              }
             }

            inhalt.setText("Das Feld" + l + "hat den größten Wert, nämlich" + args[l]);
             }
            }

            1. Hallo,

              genau das Problem habe ich immernoch, obwohl ich den Array jetzt so deklariert habe... und zwar net beim Kompilieren, sondern beim Anzeigen im Browser...

              Ja, einfach noch das Label zum Applet adden, dann zeigt er es auch
              an. :-)
              Dann solltest du noch entweder die Hintergrundfarbe der Applet-
              Zeichenfläche oder die Vordergrundfarbe des Labels auf weiß setzen.
              Schwarz auf Schwarz liest sich meist nämlich recht schlecht. :-)

              Beispiel:

              public void init()
              {
              setBackground(Color.black);
              Label inhalt = new Label ("", Label.CENTER);

              inhalt.setForeground(Color.WHITE);

              this.add(inhalt);

              int l = 0;
              long args[] = new long[21];

              ___________________________^^

              Hier reicht wirklich 20, da du ja nur bis 19 zählst.

              Und dann müßte es schon gehen. (Tut es zumindest in meiner Lokalversion
              hier jetzt.)

              Gruß
              Slyh

  2. Hallo,

    ich bin mal so frei und nehme den Code ein wenig auseinander.

    Hier der Code:

    import java.applet.*;

    public class Move extends Applet
    {
    public void init()
    {
    setBackground(Color.black);
    }

    Soweit wohl richtig.

    Label inhalt = new Label();

    Hier erzeugst du dir ein Label. Label ist ein Klasse im Package
    java.awt. Du solltest also entweder die Klasse "Label" vollständig
    qualifiziert ansprechen (java.awt.Label) oder oben noch ein
    entsprechendes import hinzufügen (import java.awt.*; oder import.java.awt.Label).

    Dir ist schon klar, daß das Label nie mehr irgendwo angezeigt wird?

    Übrigens solltest du schon alleine wegen der Lesbarkeit alle Variablen-
    deklarationen usw. ganz zuoberst in die Klasse einfügen, also nach
    dem "public class XXX {".

    Vermutlich wolltest du hier aber sowieso lokale Variablen deklarieren.
    Dazu gleich mehr.

    int l = 0;
    int args[] = {};

    int args[] = new args[20];

    Schließlich willst du ein Array mit 20 Elementen. Die Werte werden
    übrigens alle automatisch auf 0 initialisiert. (Was in deinem Fall
    nicht relevant ist. Ich wollt's nur am Rande erwähnen.)

    for (int i=0;i<20;i++) {
      args[i] = math.random();
      if(i>0) {
       if(args[i-1] < args[i]) {
        l = i;
       }
      }
    }

    Diese ganze Block steht jetzt ziemlich verloren mitten in der Klasse.
    Das darf in Java nicht sein. Der Code muß sich generell in
    einer Methode befinden. Vermutlich wolltest du den Code in die
    Methode "run()" schreiben. Die wird - sofern ich mich recht erinnere -
    beim Aufruf des Applets ausgeführt. Guck aber am besten nochmal in
    der Java-Doku nach.
    Die Variablen-Deklarationen von weiter oben würdest du dann vermutlich
    auch am besten in dieser run()-Methode unterbringen.

    inhalt.setText("Das Feld" + l + "hat den größten Wert, nämlich" + args[l]);
    }

    Hier setzt du den Wert von dem vorhin erzeugten Label. Nur wird dieses
    Label nirgends angezeigt.
    Du müßtest das Label z.B. mit der add()-Methode von Applet noch zum Applet-Darstellungsbereich hinzufügen.

    Ich hoffe nichts vergessen zu haben. Ansonsten: Einfach schreien! :-)

    Gruß
    Slyh

    1. Hallo nochmal,

      Diese ganze Block steht jetzt ziemlich verloren mitten in der Klasse.
      Das darf in Java nicht sein. Der Code muß sich generell in
      einer Methode befinden. Vermutlich wolltest du den Code in die
      Methode "run()" schreiben. Die wird - sofern ich mich recht erinnere -
      beim Aufruf des Applets ausgeführt. Guck aber am besten nochmal in
      der Java-Doku nach.

      Die Methode heißt nicht "run()", sondern "start()" und wird immer dann
      aufgerufen, wenn das Applet "neu" angezeigt wird: Direkt nachdem
      "init()" aufgerufen wurde und jedesmal wenn die Seite mit dem Applet erneut
      angezeigt wird. (Zum Beispiel wenn der Benutzer zwischenzeitlich weiter-
      gesurft und dann über den Back-Button wiedergekommen ist.)
      Die Methode "stop()" wird entsprechend aufgerufen, wenn die Seite mit
      dem Applet verlassen wird. Die Applet-Klasse wird dabei noch nicht
      (unbedingt) entfernt. Wenn das Applet wirklich entfernt wird, wird die
      "destroy()"-Methode aufgerufen.
      Du solltest den Programmlauf als in der Methode "start()" anstoßen, in
      der Methode "stop()" anhalten und die Aufräumarbeiten (sofern notwendig) in der Methode "destroy()" vornhemen.
      Steht aber auch alles in der Java-Doku.
      (http://java.sun.com/j2se/1.4/docs/api/java/applet/Applet.html#init())

      Sorry für den Spam!

      Gruß
      Slyh