[Logo der Universität Bayreuth]
Universität Bayreuth

Mathematisches
Institut



 Einleitung

 Erste Schritte

 Mail und News

 Drucken

 KDE

 LaTeX/TeX

 Linksammlung

 Linuxtools

 Netzwerk

 Programmieren

 Windows

 X Window

 Anträge

 Kontakt

Java <-

Fragen zu Java

Hier werden einige Fragen zu Java beantwortet, die im Laufe von verschiedenen Kursen gestellt wurden.

down Unterschied: Arrays von Objekten und Arrays von Standarddatentypen (19.01.2005)
down Wie kann man in Applikationen zeichnen? (19.01.2005)
down Wie kann man in Java die aktuelle Uhrzeit abrufen? (07.12.2004)
down Kann man in Java auch C-/C++-Programme aufrufen? (22.12.2004)
down Was macht man, wenn der Internet Explorer in einem Warnfenster den Hinweis 'Error: Expected ";"' beim Ansehen einer HTML-Seite mit einem Java-Applet bringt? (06.12.2004)

  1. Unterschied: Arrays von Objekten und Arrays von Standarddatentypen

    Unterschied: Standarddatentypen und Klassen

    Standarddatentypen (oder auch: elementare oder primitive Datentypen genannt) sind:
    boolean, char, byte, short, int, long, float, double

    Standarddatentypen (wie z.B. int) erlauben im Gegensatz zu Klassen nicht, objektabhängige Methoden für solche Variablen aufzurufen. Außerdem haben solche Variablen auch keine objektabhängigen Datenelemente. Ein Standarddatentyp kann auch keine objektunabhängigen Datenelemente oder Methoden bereitstellen, so dass kein Konzept der Objektorientierung (Klassen, Methoden, Vererbung, Erben/Überschreiben von Methoden, ...) für Standarddatentypen zur Verfügung steht.

    Gemeinsames und Unterschiede beim Anlegen von Arrays

    Die Festlegung der Variable als Array sowie das Festlegen der Arraylänge geht beides Mal analog. Allerdings muss man zusätzlich bei einem Array von Objekten für jede Arraykomponente entweder den Konstruktor aufrufen oder auf bereits erzeugte Objekte derselben Klasse verweisen.

    Grundsätzlich gilt bei allen Arrays, dass man die sofortige Initialisierung durch Aufzählung mit Werten mit Hilfe von anonymen Arrays auseinander ziehen kann.
    Beispiel:

    // sofortige Initialisierung durch Aufzählung
    int [] zahlen = { 10, 3, 13 };
    // alternativ: zuerst Datentyp als Array festlegen
    int [] zahlen;
    // dann mit anonymen Arrays später initialisieren
    zahlen = new int[] { 10, 3, 13 };
            

    Beispiel: Anlegen von Arrays mit Standarddatentypen bzw. Objekten

    Aufgabe Beispiel mit
    Array von int-Werten
    Beispiel mit
    Array von Color-Werten
    1) Variable als
    Array festlegen
    int [] zahlen; Color [] farben;
    2a) Array anlegen mit
    vorgegebener Länge
    zahlen = new int[10]; farben = new Color[10];
    2b) Werte der Array-
    komponenten setzen
    for (int i = 0; i < zahlen.length; ++i)
      zahlen[i] = i*10;
                  
    for (int i = 0; i < zahlen.length; ++i)
      farben[i] = new Color(i, i+5, i+10);
                  
    3) Array mit vorgegebenen
    Werten anlegen
    // Arraykomponenten durch
    // vordefinierte int-Werte vorbesetzt
    zahlen = new int[] { 10, 3, 13 };
    // oder: Arraykomponenten durch vorher
    // definierte int-Variablen vorbesetzt
    int n1 = 10, n2 = 3, n3 = 13;
    zahlen = new int[] { n1, n2, n3 };
                  
    // Arraykomponenten durch
    // vordefinierte Farben vorbesetzt
    farben = new Color[] { Color.red, Color.blue,
                           Color.black };
    // oder: Arraykomponenten durch
    // vorher erzeugte Objekte vorbesetzt
    Color f1 = new Color(10, 128, 132),
          f2 = new Color(20, 99, 78),
          f3 = new Color(99, 18, 13);
    farben = new Color[] { f1, f2, f3 };
    // oder: Kurzfassung von Darüberstehendem
    farben = new Color[] { new Color(10, 128, 132),
                           new Color(20, 99, 78),
                           new Color(99, 18, 13) };
                  

    Sonderfall: String-Arrays

    Da Strings in Java Objekte der Klasse java.lang.String sind, geht alles im Prinzip analog wie beim Color-Array. Allerdings hat man die Besonderheit, dass wegen der Stringkonstanten nicht notwendigerweise ein Konstruktor von String aufgerufen werden muss.

    // 1) Variable als String-Array festlegen
    String [] items;
    // 2a) String-Array anlegen mit vorgegebener Länge
    items = new String[10];
    // 2b) Werte der Arraykomponenten setzen
    /*
      umständlich: mit Konstruktoraufrufen
      for (int i = 0; i < items.length; ++i)
        items[i] = new String("Tagungspunkt " + i + ")");
    */
    /*
      kürzer: mit Stringkonstanten
    */
    for (int i = 0; i < items.length; ++i)
      items[i] = "Tagungspunkt " + i + ")";
    // 3) Array mit vorgegebenen Werten anlegen
    // Arraykomponenten durch vorher definierte Stringobjekte vorbesetzt
    String punkt_1 = "1. Tagungspunkt",
           punkt_2 = "2. Tagungspunkt",
           sonst = "Sonstiges";
    items = new String[] { punkt_1, punkt_2, sonst };
    // Kurzfassung: Arraykomponenten durch Stringkonstanten vorbesetzt
    items = new String[] { "1. Tagungspunkt", "2. Tagungspunkt", "Sonstiges" };
            

    vordefinierte Werte von Arrays und Arraykomponenten

    Arrays oder Objekte haben als vordefinierten Wert nicht eine Zahl 0 oder 0.0, sondern die Referenz null, also eine Referenz/einen Verweis auf einen ungültigen Speicherplatz. Greift man trotzdem versehentlich damit auf objektabhängige Datenelemente oder Methoden zu, ergibt sich der berüchtigte Laufzeitfehler "NullPointerException".

      Beispiel mit
    Array von int-Werten
    Beispiel mit
    Array von Color-Werten
    Aufgabe Sourcecode Wert Sourcecode Wert
    1) Variable als
    Array festlegen
    int [] zahlen; Array zahlen hat den Wert null Color [] farben; Array farben hat den Wert null
    2a) Array anlegen mit
    vorgegebener Länge
    zahlen = new int[10]; alle Arraykomponenten zahlen[i] haben den Wert 0 (Standardwert für Datentyp int) farben = new Color[10]; alle Arraykomponenten farben[i] haben als Objekte den Wert null (Standardwert für Objekte)

    top top

  2. Wie kann man in Applikationen zeichnen?

    Die Grundidee ist folgende: Man muss ein neues Fenster aufmachen in der main(..)-Methode der Applikation (meist ein JFrame-Objekt, da dieses einen Fenstertitel haben kann, die Größe ändern kann, ... .
    Zum leeren JFrame-Objekt fügt man ein Objekt der Klasse MyCanvas (abgeleitet von der Klasse Canvas) hinzu.
    Ein Canvas-Objekt (Canvas steht für Leinwand) ist ein GUI-Element zum Zeichnen. Zum Zeichnen muss man also die Klasse Canvas ableiten und mit einer eigenen paint(..)-Methode wie beim JApplet ausstatten.
    Die gewünschte Größe für die Zeichnung muss man geeignet an das Objekt der abgeleiteten Klasse MyCanvas weitergeben oder festlegen.

    1. Beispiel:
    Umschreiben des Applets "Applet_Fest.java" mit zugehörigem HTML-File "Applet_Fest.html"
    Das Applet geht von einer festen Größe des Appletbereichs (400 x 200 Pixel) aus, hat keine Datenelemente und nur eine paint(..)-Methode.
    Die Applikation "Applikation_Fest.java" verwendet die von Canvas abgeleitete Klasse MyCanvas_Fest. Diese Größe muss als Rückgabewert der Methode getPreferredSize() eingetragen werden. Die paint(..)-Methode von MyCanvas_Fest wird automatisch beim Sichtbarwerden des JFrame-Objekts gezeichnet.
    Die Klasse MyCanvas_Fest kann man im Fall fest vorgegebener Zeichengröße wiederverwenden für eigene Applikationen, nur die paint(..)-Methode und die Größe des Zeichenbereichs als Rückgabewert von getPreferredSize() muss man verändern.

    2. Beispiel:
    Umschreiben des Applets "Applet_Statisch.java" mit zugehörigem HTML-File "Applet_Statisch.html"
    Das Applet fragt die aktuelle Größe des Appletbereichs nur in der init()-Methode ab und besitzt auch Datenelemente.
    Die Applikation "Applikation_Statisch.java" geht wie im 1. Beispiel vor. Nur besitzt die abgeleitete Klasse MyCanvas_Statisch diesmal einen Konstruktor, an den man die gewünschte Größe der Zeichnung übermittelt. Dazu muss die Klasse MyCanvas_Statisch Datenelemente für Breite und Höhe haben, was sie flexibler macht. Die Methoden getWidth() und getHeight() werden bereitgestellt (Verwendung dann wie in einem Applet), liefern aber einfach nur die (fixen) Datenelemente. Eine dynamische Größe der Zeichnung wird aber dadurch ausgeschlossen (Ausweg: 3. Beispiel).
    Die Datenelemente des Applets werden einfach zu Datenelemente der Klasse MyCanvas_Statisch. Die init()-Methode des Applets fügt man in die Klasse MyCanvas_Statisch ein. Allerdings muss man dann im Konstruktor dieser Klasse selbst die init()-Methode aufrufen, da diese Methode nur bei Applets automatisch aufgerufen wird.
    Diese Klasse kann man im Fall flexibel zu ermittelnder Anfangsgröße des Zeichenbereichs, der sich dann aber nicht mehr ändern darf, wiederverwenden für eigene Applikationen, nur deren Datenelemente, die init() und die paint(..)-Methode muss man verändern.

    3. Beispiel:
    Umschreiben des Applets "Applet_Dynamisch.java" mit zugehörigem HTML-File "Applet_Dynamisch.html"
    Das Applet fragt die aktuelle Größe des Appletbereichs in der paint(..)-Methode ab, besitzt auch Datenelemente und eine init()-Methode.
    Die Applikation "Applikation_Dynamisch.java" geht wie im 2. Beispiel vor. Nur reagiert die abgeleitete Klasse MyCanvas diesmal auf Veränderungen ihrer Größe durch Implememtieren des Interfaces ComponentListener und Reaktion auf zugehörige Ereignisse der Klasse ComponentEvent. Ändert sich die Größe eines Objekts der Klasse MyCanvas, passen sich dessen Datenelement für Breite und Höhe an die aktuellen Werte an. Damit erhält man eine dynamische Anpassungsfähigkeit.
    Diese Klasse kann man im Fall dynamisch anzupassender Größe des Zeichenbereichs man wiederverwenden für eigene Applikationen, nur deren Datenelemente, die init() und die paint(..)-Methode muss man verändern.

  3. Wie kann man in Java die aktuelle Uhrzeit abrufen?

    Dies funktioniert z.B. mit der Klasse java.util.GrgeorianCalendar. Ist das Betriebssystem auf die richtige Zeitzone (z.B. Europa/Berlin) und auf die richtige Locale (deutsch/Deutschland) eingestellt, kann man den Defaultkonstruktor verwenden und erhält die beim Aufruf aktuelle Uhrzeit (inkl. Datum).

    Achtung: Die Uhrzeit aktualisiert sich nicht selbstständig im Objekt. Will man die aktuelle Uhrzeit später nochmals ausgeben, muss man wieder ein neues Objekt der Klasse GrgeorianCalendar anlegen.

    Mit einem Objekt dieser Klasse bekommt man über die get(..)-Methode und der Angabe des richtigen Feldes (Feldname = Konstante der Klasse java.util.Calendar) die gewünschten Informationen (Tag, Monat, Stunde, Minute, ...).

    Beispiel:

       import java.util.*;
       ...
       // in einer Methode Abfrage des aktuellen Datums mit Uhrzeit:
       GregorianCalendar cal = new GregorianCalendar(); // Default-TimeZone und -Locale des Betriebssystems
       int jahr = cal.get(Calendar.YEAR); // aktueller Jahr (1970-...)
       int month = cal.get(Calendar.MONTH) + 1; // aktueller Monat (1-12)
       int tag = cal.get(Calendar.DAY_OF_MONTH); // aktueller Tag (1-31)
       int stunden = cal.get(Calendar.HOUR_OF_DAY); // aktuelle Stunde (0-24)
       int minuten = cal.get(Calendar.MINUTE); // aktuelle Minuten (0-59)
       int sekunden = cal.get(Calendar.SECOND); // aktuelle Sekunden (0-59)
       int milli_sekunden = cal.get(Calendar.MILLISECOND); // aktuelle Millisekunden (0-999)
       ...
       // später: nochmals aktuelle Uhrzeit abfragen
       // (minuten, sekunden, milli_sekunden aktualisieren sich nicht neu,
       // in cal steht vor der folgenden Zeile noch die veraltete Uhrzeit)
       cal = new GregorianCalendar();
       ...
            

    Hat das Betriebssystem eine andere Zeitzone oder Locale, verwendet man besser den allgemeinen Konstruktor:

       TimeZone tz = TimeZone.getTimeZone("Europe/Berlin");
       Locale loc = Locale.GERMANY;
       GregorianCalendar cal = new GregorianCalendar(tz, loc); // TimeZone und Locale für Deutschland
            

    Die folgende Java-Applikation "CmdLineUhr.java" von Manuel Doss zeigt in der DOS-Box bzw. in der Shell die aktuelle Uhrzeit an.

    top top

  4. Kann man in Java auch C-/C++-Programme aufrufen?

    einfachere Lösung:
    Man starte mit einem Runtime-Objekt einen Prozess (hier: Executable eines C-/C++-Programmes), warte das Ende ab in Java und fahre im Java-Programm fort. Der Datenaustausch kann über mit Java bzw. C/C++ erzeugte Dateien passieren.

    Grobidee:

       Runtime rt = Runtime.getRuntime();
       Prozess p = null;
       int status = 0;
       try
       {
         p = rt.exec("a.out"); // starte kompiliertes C-/C++-Programm
         status = p.waitFor(); // auf das Ende des Prozesses warten,
                                    // in "status" den exit-Status des Prozesses
                                    // speichern
       }
       catch (IOException exc)
       {
         System.err.println("Problem beim Ausf\u00FChren von \"a.out\"!");
         System.err.println(exc);
         exc.printStackTrace();
         System.exit(1);
       }
            

    flexiblere Lösung:
    Man benutze das Native Interface von Java (JNI), vgl. das Java Tutorial oder die lokale Dokumentation zu JNI
    Dazu muss man die C-/C++-Funktion als Objektfile übersetzen, es in eine shared Library einpacken und diese dann mit der System-Klasse durch die Methode "loadLibrary(..)" einladen. Das JNI bietet noch weitergehende Möglichkeiten der Interaktion von Java mit dem nativen C-/C++-Programm.

    top top

  5. Was macht man, wenn der Internet Explorer in einem Warnfenster den Hinweis 'Error: Expected ";"' beim Ansehen einer HTML-Seite mit einem Java-Applet bringt?

    Es scheint sich um ein Problem des Internet Explorers zu handeln. Diese Meldung tritt bei anderen Browser nicht auf, denn es handelt sich um eine JavaScript-Warnung. Oft hilft es, die Warnung zu bestätigen und die HTML-Seite mit dem Java-Applet wird danach korrekt dargestellt. Es handelt sich nicht um ein Java-Problem! Die Meldung kann auch auftreten, wenn gar kein JavaScript in der HTML-Seite mit dem Java-Applet verwendet wurde! Abhilfe schafft (neben einem anderen Browser) das JavaScript-Debuggen abzuschalten.

top top

Verbesserungsvorschläge, Fragen und Anregungen an
Robert Baier ([e-mail-Adresse von Robert Baier])
© 2004/2005 Robert Baier, Manuel Doss
[Seitenzähler] Last modified: 22.07.2015