Null i walidacja danych
Użytkownik może wpisać litery zamiast liczby, a plik może zniknąć. Nauczysz się odróżniać zwykłą walidację od obsługi wyjątków.
Czego się dziś nauczysz
- Odróżnisz null od pustego napisu i zera.
- Użyjesz ?? oraz sprawdzenia null.
- Zapiszesz try i catch dla konkretnego wyjątku.
Przygotowanie: lekcje 01–33. Przewidywany czas: 45–90 minut z zadaniami. Przykłady wymagają .NET 8 lub nowszego, z włączonymi ImplicitUsings i Nullable.
Wyjaśnienie krok po kroku
Brak wartości
string? sygnalizuje, że zmienna może zawierać null. int? może mieć liczbę albo brak liczby. null, 0 oraz pusty napis oznaczają różne rzeczy. Operator ?? wybiera prawą stronę tylko wtedy, gdy lewa jest null. Operator ?. wywołuje element tylko dla nie-null i w przeciwnym razie daje null.
Walidacja przed obliczeniem
Dla wpisanej liczby najczęściej używamy TryParse i warunków zakresu. Nie każda poprawnie sparsowana liczba ma sens jako wiek lub ocena. Dla double także NaN i nieskończoności mogą być wynikiem parsowania, więc w obliczeniach wymagających zwykłej liczby sprawdzamy double.IsFinite.
Obsługa wyjątków
try obejmuje operację, która może zgłosić wyjątek; pasujący catch obsługuje konkretny typ. finally służy do sprzątania przy wyjściu z bloku w normalnym działaniu procesu, również przy wyjątku. Nie obiecujemy jego wykonania po awarii procesu lub odcięciu zasilania. Nie ukrywaj wszystkich wyjątków pustym catch.
Przykład do zbadania
Wklej cały przykład do nowego projektu konsolowego jako Program.cs. Zastąp poprzednią zawartość pliku. Nie łącz kilku całych programów w jednym pliku.
using System;
string? wpis = null;
Console.WriteLine(wpis ?? "Brak wpisu");
try
{
int liczba = int.Parse("kot");
Console.WriteLine(liczba);
}
catch (FormatException)
{
Console.WriteLine("To nie jest liczba calkowita.");
}
Console.WriteLine("Program dziala dalej.");
Brak wpisu
To nie jest liczba calkowita.
Program dziala dalej.
Co dzieje się po kolei
- Brak wpisu jest wartością zastępczą wybraną przez ??.
- Parse zgłasza FormatException, więc linia wypisująca liczba zostaje pominięta.
- Po obsłużonym wyjątku wykonanie przechodzi za catch, a nie do przerwanej instrukcji.
Użyte w tej lekcji elementy
Metody .NET są gotowymi narzędziami biblioteki. Instrukcje języka i nasze metody oznaczamy osobno. Właściwości, np. Length, odczytujemy bez nawiasów.
| Element | Wynik | Działanie i ograniczenia |
|---|---|---|
int.Parse(tekst) |
int | Przetwarza tekst; zły format daje FormatException, liczba poza zakresem int daje OverflowException. |
int.TryParse(tekst, out wynik) |
bool | Próba konwersji bez tych wyjątków dla niepoprawnego tekstu. |
double.IsFinite(wartosc) |
bool | Zwraca false dla NaN i obu nieskończoności. |
Console.WriteLine(wartosc) |
void | Wyświetla wartość i koniec wiersza. |
Częste błędy
- Operator ! po zmiennej nie usuwa null; wycisza analizę kompilatora.
- ?? nie zastępuje pustego napisu.
- Po catch program nie wraca automatycznie do try, by ponowić operację.
Wyjątki to osobny temat
Ta lekcja pokazuje try i catch w najprostszej postaci, jako zabezpieczenie
danych. Zgłaszanie własnych błędów instrukcją throw, blok finally i
kolejność bloków catch omawia lekcja 35.
Zadania
Wypisz wynik tekst ?? "brak" dla null, "" oraz "Ala".
Sprawdź: Wyniki: brak, pusty wiersz, Ala.
Przepisz próbę odczytania "kot" za pomocą TryParse.
Sprawdź: Komunikat o złych danych, brak przerwania programu.
Sprawdź teksty 5, 7 i kot jako oceny 1–6.
Sprawdź: Tylko 5 jest poprawne.
Sprawdź, czy rozumiesz
Wyjaśnij własnymi słowami, jak działa główny przykład i dlaczego daje taki wynik. Następnie zmień jedną daną i przewidź wynik przed uruchomieniem. Wróć do celów lekcji i sprawdź, które potrafisz już wykonać samodzielnie.
Dokumentacja: Microsoft Learn — temat tej lekcji.