Menu
Coddy logo textTech

Die Operatoren ? und !

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 25 von 110.

Beim Arbeiten mit Nullable-Typen bietet Dart zwei wesentliche Operatoren, um sicher auf Werte zuzugreifen. Der null-aware Zugriffsoperator ?. und der Null-Assertion-Operator ! geben Ihnen die Kontrolle darüber, wie Sie mit potenziell nullwertigen Werten umgehen.

Der ?.-Operator greift sicher auf Eigenschaften oder Methoden eines Nullable-Werts zu. Wenn der Wert null ist, gibt der gesamte Ausdruck null zurück, anstatt abzustürzen:

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (kein Absturz!)

Der !-Operator teilt Dart mit: „Ich bin sicher, dass dieser Wert nicht null ist.“ Er konvertiert einen Nullable-Typ in einen Non-Nullable-Typ, wirft jedoch einen Fehler, wenn der Wert tatsächlich null ist:

String? maybeName = 'Bob';
String definite = maybeName!;  // OK - wir versichern, dass es nicht null ist
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Laufzeitfehler! Wert war null

Verwenden Sie ?., wenn Sie Null-Werte elegant behandeln möchten. Verwenden Sie ! nur dann, wenn Sie absolut sicher sind, dass ein Wert existiert – vielleicht nachdem Sie ihn mit einer if-Anweisung überprüft haben oder wenn Sie wissen, dass die Logik einen Wert garantiert. Die übermäßige Verwendung von ! macht den Zweck der Null-Sicherheit zunichte und kann zu Abstürzen zur Laufzeit führen.

challenge icon

Aufgabe

Einfach

Lass uns ein Produktinventarsystem erstellen, das zeigt, wie man mit den Operatoren ?. und ! sicher mit möglicherweise nullbaren Werten arbeitet.

Du erstellst zwei Dateien, um deinen Code zu organisieren:

  • product.dart: Definiere eine Product-Klasse, die einen Artikel im Inventar darstellt. Einige Produkte verfügen über vollständige Informationen, während andere noch erfasst werden. Deine Klasse sollte Folgendes enthalten:
    • Einen nicht nullbaren String name – jedes Produkt muss einen Namen haben
    • Einen nicht nullbaren double price – jedes Produkt muss einen Preis haben
    • Eine nullable String? description – einige Produkte haben noch keine Beschreibung
    • Eine nullable String? category – einige Produkte wurden noch keiner Kategorie zugeordnet
    • Einen Konstruktor, der name und price als erforderliche Parameter entgegennimmt
    • Eine Methode getDescriptionLength(), die mithilfe von ?. die Länge der Beschreibung zurückgibt oder null, wenn keine Beschreibung vorhanden ist
    • Eine Methode getCategoryUppercase(), die mithilfe von ! die Kategorie in Großbuchstaben zurückgibt – diese Methode setzt voraus, dass die Kategorie gesetzt wurde
    • Eine Methode displayProduct(), die die Produktinformationen ausgibt und No description anzeigt, wenn die Beschreibung null ist, sowie Uncategorized, wenn die Kategorie null ist
  • main.dart: Importiere deine Produktklasse und demonstriere beide Operatoren:
    • Erstelle ein Produkt mit dem Namen 'Laptop' und dem Preis 999.99, setze anschließend seine Beschreibung auf 'High-performance computing device' und seine Kategorie auf 'Electronics'
    • Erstelle ein Produkt mit dem Namen 'Mystery Item' und dem Preis 49.99 (lasse Beschreibung und Kategorie auf null)
    • Für den Laptop: Rufe displayProduct() auf, gib Description length: [length] mithilfe von getDescriptionLength() aus und gib Category: [uppercase] mithilfe von getCategoryUppercase() aus
    • Für das Mystery Item: Rufe displayProduct() auf und gib Description length: [length] mithilfe von getDescriptionLength() aus (dies wird null anzeigen)

Die Methode displayProduct() sollte in diesem Format ausgeben:

Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]

Erwartete Ausgabe:

Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: null

Probier es selbst

import 'product.dart';

void main() {
  // TODO: Erstelle ein Produkt namens 'Laptop' mit dem Preis 999.99
  // Setze dann seine Beschreibung auf 'High-performance computing device'
  // Und setze seine Kategorie auf 'Electronics'
  
  // TODO: Erstelle ein Produkt namens 'Mystery Item' mit dem Preis 49.99
  // Lasse Beschreibung und Kategorie als null
  
  // TODO: Für den Laptop:
  // - Rufe displayProduct() auf
  // - Drucke "Description length: [length]" unter Verwendung von getDescriptionLength()
  // - Drucke "Category: [uppercase]" unter Verwendung von getCategoryUppercase()
  
  // TODO: Für das Mystery Item:
  // - Rufe displayProduct() auf
  // - Drucke "Description length: [length]" unter Verwendung von getDescriptionLength()
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler