Java-Grundlagen: Ausdrücke, die kleinsten ausführbaren Einheiten in Java

In Programmiersprachen wie Java setzen sich Programme aus vielen einzelnen kleinen Bausteinen zusammen. Diese Bausteine werden als Ausdrücke bezeichnet. Sie bilden die kleinsten ausführbaren Einheiten einer Anwendung.

Mit Hilfe von Ausdrücken werden Variablen Werte zugewiesen, logische Bedingungen genküpft und numerische Berechnungen durchgeführt. Die Zusammensetzung von Ausdrücken ist exakt festgelegt. Sie bestehen immer aus Operatoren und Operanden, auf die Operatoren angewendet werden.

Ein Beispiel für einen Ausdruck: gehaltNetto = gehaltBrutto - abgaben;

plhq_teaser_hbox_gelb_fotolia_RA Studio_46292813

Unser großes
Android Online-Kurs
Gesamtpaket



Weitere Infos

In Java wird zwischen den folgenden 6 verschiedenen Operatortypen unterschieden:

Wie diese 6 Operatortypen funktionieren und was bei ihrer Verwendung beachtet werden muss, werden wir in einem anderen Beitrag behandeln.

Für Programmierer ist das korrekte Verständnis der Operatortypen sehr wichtig, da sie die elementaren Bestandteile des Quellcodes sind.

Daher sollten Programmieranfänger sich nicht scheuen mit den verschiedenen Operatortypen zu experimentieren.

Eigenschaften von Ausdrücken in Java

In Java besitzen Ausdrücke immer auch einen Rückgabewert, der sich aus der Anwendung des Operators auf die zugewiesenen Operanden ergibt. Von welchem Typ der Rückgabewert dabei ist, ist von den verwendeten Operanden- und Operatortypen abhängig.

In Ausdrücken können Java-Operatoren mehrere Argumente zugewiesen werden. Die mögliche Anzahl ist durch die Stelligkeit des Operators vorgegeben, diese gibt an wie viele Argumente er benötigt. Man unterscheidet dabei:

  • Einstellige Operatoren – Der bekannteste ist das negative Vorzeichen, auch als unäres Minus bezeichnet oder der logische Nicht-Operator.
  • Zweistellige Operatoren – Beispielsweise arithmetische Operatoren, wie für die Addition, Subtraktion, Multiplikation oder Division.
  • Den dreistelligen Operator – Der Fragezeichen-Operator ist der einzige dreistellige Operator in Java. Er ist für Fallunterscheidungen zwischen Fall A oder B sehr hilfreich.

Die Auswertungreihenfolge von Ausdrücken ist in Java durch die Bindungsregeln festgelegt. In Java besitzt jeder Operator eine bestimmte Bindungskraft.

So besitzt bspw. der Multiplikations-Operator eine höhere Bindungskraft als der Additionsoperator und wird demnach in Ausdrücken zuerst ausgewertet. Wie die einfache mathematische Regel: Punktrechnung vor Strichrechnung.

Neben der Bindungsregeln gibt es noch die Assoziativitätsregeln. Über diese wird die Auswertungsreihenfolge von Operatoren derselben Bindungskraft definiert. So besitzen der Additions- und Subtraktions-Operator alleine gesehen die gleiche Bindungskraft. Werden sie aber in einer Kette von Additionen und Subtraktionen verwendet, bestimmt ihre Assoziativität über die Auswertungsreihenfolge. In diesem Fall sind beide Operatoren linksassoziativ, daher wird der Ausdruck von links nach rechts ausgewertet.

Die Auswertungsreihenfolge lässt sich durch explizite Klammerung gezielt steuern. Hierfür gelten die Regeln für die Klammerung aus der Mathematik.

Aufpassen müssen Programmierer bei Operatoren mit Nebeneffekten, wie dem Inkrement- und Dekrement-Operator. Diese Operatoren ändern den Inhalt einer Variable direkt. In komplexeren Ausdrücken sollten derartige Operatoren mit sehr viel Sorgfalt verwendet werden.

Definite Assignment – Initialisierungsfehler vermeiden

Damit Initialisierungsfehler nicht auftreten wird vom Compiler eine Datenflussanalyse ausgeführt. Es wird dabei überprüft, ob jede lokale Variable vor ihrer ersten Verwendung definitiv initialisiert ist. Dieses Konzept wird in Java als Definite Assignment bezeichnet.

Der Compiler prüft den Quelltext per Datenflussanalyse und zwar indem jeder mögliche Ausführungspfad, von der Deklaration einer Variable bis zu ihrer Verwendung, ermittelt wird und sichergestellt ist, dass kein Pfad existiert, der eine Initialisierung auslassen würde.

Siehe dazu die beiden folgenden Beispielanwendungen. In der ersten liegt ein Initialisierungsfehler vor.

Beispiel Definite Assignment Initialisierungsfehler in Java.

/*
* Beispielanwendung Definite Assignment Initialisierungsfehler in Java.
*/

public class DefiniteAssignment{
    public static void main(String[] args) {

        char zeichen = 'F';
        String ergebnis;

        if (zeichen == 'P') {
            ergebnis = "bestanden";
        }        

        System.out.println("\nPruefergebnis: " + ergebnis);    
    }
}

In dem oberen Quellcode-Beispiel zu Definite Assignment wird die Variable ergebnis vor ihrer Verwendung nicht initialisiert. Es gibt einen Ausführungspfad der zu Zeile 15 führt, ohne dass dabei die Variable ergebnis initialisiert wird und zwar wenn zeichen != 'P' ist.

In der unteren Abbildung ist die Kommandozeilen-Ausgabe zu der oberen Beispielanwendung dargestellt. Die Fehlermeldung des Compilers über den Initialisierungsfehler lautet: variable ergebnis might not have been initialized.

Java Definite Assignment Initialisierungsfehler

Java Definite Assignment Initialisierungsfehler – Ausgabe der Beispielanwendung

Um den Initialisierungsfehler zu vermeiden, sollte eine else-Anweisung der if-Anweisung folgen. In dem unteren Quellcode-Beispiel zu Definite Assignment wird die Variable ergebnis vor ihrer Verwendung in jedem Fall initialisiert. Entweder im if– oder im else-Zweig.

Beispiel Definite Assignment in Java.

/*
* Beispielanwendung Definite Assignment in Java.
*/

public class DefiniteAssignment2{
    public static void main(String[] args) {

        char zeichen = 'F';
        String ergebnis;

        if (zeichen == 'P') {
            ergebnis = "bestanden";
        }
        else {
            ergebnis = "nicht bestanden";
        }

        System.out.println("\nPruefergebnis: " + ergebnis);    
    }
}

Die unteren Abbildung enthält die Kommandozeilen-Ausgabe zur oberen Beispielanwendung. Der Compilers gibt keine Fehlermeldung mehr aus. Nach Starten der Anwendung wird ordnungsgemäß der Wert der Varibale ergebnis ausgegeben.

Java Definite Assignment

Java Definite Assignment – Ausgabe der Beispielanwendung

In dem nächsten Beitrag werden wir die sechs verschiedenen Operatoren-Typen behandeln.


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.