Rozwiązywanie problemów z wyjątkami: System.NullReferenceException
Element NullReferenceException występuje, gdy użytkownik próbuje użyć metody lub właściwości Typ odwołania (C#, Visual Basic) którego wartością jest null.Na przykład może nastąpiła próba użycia obiektu bez uprzedniego użycia Nowy słowo kluczowe (Nowy w języku Visual Basic), lub nastąpiła próba użycia obiektu, którego wartość została ustawiona w null (Nothing w języku Visual Basic).
Sekcje w tym artykule
Klasy używane w tym artykule
Typowe przyczyny NullReferenceExceptions
znalezienie źródła NullReferenceExceptions podczas tworzenia
umożliwia uniknięcie NullReferenceExceptions
NullReferenceExceptions obsługi w kodzie wersji
Klasy używane w tym artykule
Większość przykłady w tym artykule użyj jednej lub obu tych klas:
public class Automobile
{
public EngineInfo Engine {get; set;}
}
public class EngineInfo
{
public EngineInfo() { }
public EngineInfo(string powerSrc, double engineSize)
{
Power = powerSrc;
Size = engineSize;
}
public double Size { get; set; }
public string Power = null;
}
Public Class Automobile
Public Property Engine As EngineInfo
End Class
Public Class EngineInfo
Public Sub New()
End Sub
Public Sub New(powerSrc As String, engineSize As Double)
Power = powerSrc
Size = engineSize
End Sub
Public Property Size() As Double
Public Power As String = Nothing
End Class
Inne sekcje, w tym artykule
Typowe przyczyny NullReferenceExceptions
Wszelkie odwołanie do zmiennej typu może mieć wartości null.Zmienne lokalne właściwości klasy, parametry metody i wartości zwracane metody może wszystkie zawierać odwołanie o wartości null.Wywoływania metody lub właściwości tych zmiennych, gdy są one null powoduje NullReferenceException.Szczególnych przypadkach:
Lokalnego pola Zmienna lub element członkowski jest zadeklarowany, ale nie został zainicjowany
Właściwość lub pole ma wartość null
parametr metody ma wartość null
wartość zwracaną przez metodę ma wartość null
obiekt w kolekcji lub tablicy ma wartość null
obiektu nie została utworzona, ponieważ warunek
obiektu przekazany w odniesieniu do metody ma wartość null
Pole lokalne zmienną lub elementu członkowskiego jest zadeklarowany, ale nie został zainicjowany
Ten prosty błąd występuje najczęściej kod języka Visual Basic.Z wyjątkiem w sytuacjach, takich jak deklarowanie zmiennej do przekazania jako parametrem wyjściowym kompilatora C# zezwala na używanie zmiennej lokalne odwołanie do momentu zainicjowania.Kompilator Visual Basic wygeneruje ostrzeżenie.
W poniższych kodu C# zaznaczony wiersz generuje ten błąd kompilatora:
Korzystanie z nieprzypisane zmienna lokalna "aparat"
W kodzie języka Visual Basic zaznaczony wiersz generuje ostrzeżenie BC42104 kompilatora:
Zmienna "aparat" jest używana przed przypisano wartość. Wyjątek odwołania zerowego może spowodować w czasie wykonywania.
I linię wyjątek NullReferenceException, gdy zostanie uruchomiony.
public void NullReferencFromUninitializedLocalVariable()
{
EngineInfo engine;
Console.WriteLine(engine.ToString());
}
Public Sub NullReferencFromUninitializedLocalVariable()
Dim engine As EngineInfo
Console.WriteLine(engine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Właściwość lub pole ma wartość null
Pola i właściwości klasy są automatycznie zainicjowana w celu ich wartość domyślna po utworzeniu tej klasy.Wartość domyślna typu referencyjnego to null (Nothing w języku Visual Basic) wywoływania metod elementu członkowskiego na pola lub właściwości klasy nadrzędnej, gdy wartość pola lub właściwości jest równa null powoduje, że NullReferenceException.
W tym przykładzie zaznaczony wiersz zgłasza NullReferenceException, ponieważ Engine właściwości car jest automatycznie zainicjować wartość null.
public void NullReferenceFromProperty()
{
var car = new Automobile();
Console.WriteLine(car.Engine.ToString());
}
Public Sub NullReferenceFromProperty()
Dim car = New Automobile()
Console.WriteLine(car.Engine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Parametr metody ma wartość null
Parametr metody, który jest typem odwołania może być null (Nothing w języku Visual Basic).Wywołanie elementu członkowskiego metody lub właściwości na wartość parametru, który ma wartość null powoduje NullReferenceException.
W tym przykładzie zaznaczony wiersz zgłasza NullReferenceException, ponieważ BadEngineInfoPassedToMethod wywołania NullReferenceFromMethodParameter z parametrem, który ma wartość null.
public void BadEngineInfoPassedToMethod()
{
EngineInfo eng = null;
NullReferenceFromMethodParameter(eng);
}
public void NullReferenceFromMethodParameter(EngineInfo engine)
{
Console.WriteLine(engine.ToString());
}
Public Sub BadParameterPassedToMethod() As EngineInfo
Dim eng As EngineInfo = Nothing
NullReferenceFromMethodParameter(eng)
End Sub
Public Sub NullReferenceFromMethodParameter(engine As EngineInfo)
Console.WriteLine(engine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Wartość zwracana przez metodę ma wartość null
Metodę, która zwraca typ odwołania może zwrócić null (Nothing w języku Visual Basic).Wywołanie metody lub właściwości typu zwracane odwołanie powoduje NullReferenceException, gdy odwołanie ma wartość null.
W tym przykładzie zaznaczony wiersz zgłasza NullReferenceException, ponieważ połączenie BadGetEngineInfo zwraca odwołanie o wartości null w NullReferenceFromMethodParameter metody.
public EngineInfo BadGetEngineInfo()
{
EngineInfo engine = null;
return engine;
}
public void NullReferenceFromMethodReturnValue()
{
var engine = BadGetEngineInfo();
Console.WriteLine(engine.ToString());
}
Public Function BadGetEngineInfo() As EngineInfo
Dim engine As EngineInfo = Nothing
Return engine
End Function
Public Sub NullReferenceFromMethodReturnValue()
Dim engine = BadGetEngineInfo()
Console.WriteLine(engine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Obiekt w kolekcji lub tablicy ma wartość null
Tablica typów odniesienia lub lista może zawierać element, który ma wartość null.Wywołanie metody lub właściwości elementu listy, która jest wartością null powoduje NullReferenceException.
W tym przykładzie zaznaczonego wiersza w NullReferenceFromListItem() NullReferenceException zgłasza wyjątek, ponieważ połączenie BadGetCarList zwraca element, który ma wartość null.
public Automobile[] BadGetCarList()
{
var autos = new Automobile[10];
for (int i = 0; i autos.Length; i++)
{
if (i != 6)
{
autos[i] = new Automobile();
}
}
return autos;
}
public void NullReferenceFromListItem()
{
var cars = BadGetCarList();
foreach (Automobile car in cars)
{
Console.WriteLine(car.ToString());
}
}
Public Function BadGetCarList() As Automobile()
Dim autos = New Automobile(10) {}
For i As Integer = 0 To 9
If i <> 6 Then
autos(i) = New Automobile()
End If
Next
Return autos
End Function
Public Sub NullReferenceFromListItem()
Dim cars = BadGetCarList()
For Each car As Automobile In cars
Console.WriteLine(car.ToString())
Next
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Obiekt nie jest tworzony z powodu warunku
Jeśli typ odwołania została zainicjowana w bloku warunkowego, obiekt nie jest tworzony, gdy warunek jest fałszywy.
W tym przykładzie zaznaczonego wiersza w NullReferenceFromConditionalCreation NullReferenceException zgłasza wyjątek, ponieważ jego inicjuje engine zmiennej tylko wtedy, gdy DetermineTheCondition() Metoda zwraca true.
public bool DetermineTheCondition()
{
return false;
}
public void NullReferenceFromConditionalCreation()
{
EngineInfo engine = null;
var condition = DetermineTheCondition();
if (condition)
{
engine = new EngineInfo();
engine.Power = "Diesel";
engine.Size = 2.4;
}
Console.WriteLine(engine.Size);
}
Public Function DetermineTheCondition() As Boolean
Return False
End Function
Public Sub NullReferenceFromConditionalCreation()
Dim engine As EngineInfo = Nothing
Dim condition = DetermineTheCondition()
If condition Then
engine = New EngineInfo()
engine.Power = "Diesel"
engine.Size = 2.4
End If
Console.WriteLine(engine.Size)
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Właściwość obiekt przekazywany do metody ma wartość null
Jeśli obiekt jest przekazywany jako parametr do metody według wartości (bez korzystania z ref lub out słowo kluczowe języka C# lub ByRef słowo kluczowe w języku Visual Basic), metoda nie może zmienić lokalizację pamięci parametru — co wskazuje parametr —, ale może zmieniać właściwości obiektu.
W tym przykładzie NullPropertyReferenceFromPassToMethod Metoda tworzy Automobile obiektu i inicjuje Engine Właściwości.Następnie wywołuje BadSwapCarEngine, przekazując nowego obiektu jako parametr.BadSwapCarEngine Ustawia właściwość aparat do wartości null, która powoduje, że zaznaczony wiersz w NullPropertyReferenceFromPassToMethod do NullReferenceException wyjątku.
public void BadSwapCarEngine(Automobile car)
{
car.Engine = null;
}
public void (Automobile car)
{
car.Engine = new EngineInfo("GAS", 1.5);
BadSwapCarEngine(car);
Console.WriteLine(car.Engine.ToString());
}
Public Sub BadSwapCarEngine(car As Automobile)
car.Engine = Nothing
End Sub
Public Sub NullPropertyReferenceFromPassToMethod()
Dim car As New Automobile()
car.Engine = New EngineInfo("GAS", 1.5)
BadSwapCarEngine(car)
Console.WriteLine(car.Engine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Obiekt przekazany w odniesieniu do metody ma wartość null
Kiedy przekazania typu odwołania jako parametr do metody w odniesieniu (przy użyciu ref lub out słowo kluczowe języka C# lub ByRef słowo kluczowe w języku Visual Basic), można zmienić lokalizację pamięci, który wskazuje parametr.
W przypadku przekazania typu odwołania w odniesieniu do metody, metoda można ustawić typ występujących w odwołaniu null (Nothing w języku Visual Basic).
W tym przykładzie zaznaczonego wiersza w NullReferenceFromPassToMethodByRef NullReferenceException zgłasza wyjątek, ponieważ połączenie BadEngineSwapByRef zestawy metody stockEngine zmiennej na wartość null.
public void BadEngineSwapByRef(ref EngineInfo engine)
{
engine = null;
}
public void NullReferenceFromPassToMethodByRef()
{
var stockEngine = new EngineInfo();
stockEngine.Power = "Gas";
stockEngine.Size = 7.0;
BadSwapEngineByRef(ref stockEngine);
Console.WriteLine(stockEngine.ToString());
}
Public Sub BadSwapEngineByRef(ByRef engine As EngineInfo)
engine = Nothing
End Sub
Public Sub NullReferenceFromPassToMethodByRef()
Dim formatStr = "The stock engine has been replaced by a {0} liter {} engine"
Dim stockEngine = New EngineInfo()
stockEngine.Power = "Gas"
stockEngine.Size = 7.0
BadSwapEngineByRef(stockEngine)
Console.WriteLine(stockEngine.ToString())
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Znalezienie źródła wyjątku odwołanie o wartości null podczas tworzenia aplikacji
Umożliwia wyświetlanie wartości zmiennych poradami do danych, okno zmienne lokalne i windows obserwowanych
zapoznaj się z stosu wywołań, aby znaleźć, gdy odwołanie do zmiennej nie jest zainicjowana lub ustawione na wartość null
Ustawianie warunkowych punktów przerwania, aby zatrzymać debugowania, jeśli obiekt ma wartość null (NIC w języku Visual Basic)
Umożliwia wyświetlanie wartości zmiennych poradami do danych, okno zmienne lokalne i obserwowanych systemu windows
Wskaźnik myszy na nazwę zmiennej, aby wyświetlić jego wartość w Porada danych.Jeśli zmienna odwołuje się do obiektu lub kolekcji, można rozszerzyć na typ danych, aby sprawdzić jego właściwości lub elementów.
Otwórz Zmienne lokalne okna, aby sprawdzić zmiennych, które działają w bieżącym kontekście.
Użyj Obserwuj okno skupić się na zmienną zmiany ilości przechodzenia do kolejnych kod.
Wpisy w tej sekcji
Sekcje w tym artykule
Zapoznaj się z stosu wywołań, aby znaleźć, gdy odwołanie do zmiennej nie jest zainicjowana lub ustawione na wartość null.
Program Visual Studio oknie stos wywołań Wyświetla listę nazwy metody, które nie zakończyły się po zatrzymaniu debugera przy wyjątku lub punkt przerwania.Można wybrać nazwę w stos wywołań okna i wybierz polecenie przełącznika ramkę do zmiany kontekstu wykonywania metody i należy sprawdzić, czy jego zmiennych.
Wpisy w tej sekcji
Sekcje w tym artykule
Ustawianie warunkowych punktów przerwania, aby zatrzymać debugowania, jeśli obiekt ma wartość null (NIC w języku Visual Basic)
Można ustawić warunkowych punkt przerwania do dzielenia, gdy zmienna ma wartość null.Punkty przerwania warunkowe może być przydatna, gdy odwołanie o wartości null nie występuje często — na przykład, jeśli element w kolekcji ma wartość null tylko sporadycznie.Zaletą warunkowych przerwania to między innymi do debugowania problemu, przed dokonaniem do obsługi określonego procedury.
Wpisy w tej sekcji
Sekcje w tym artykule
Unikanie NullReferenceExceptions
Debug.Assert Użyj, aby upewnić się, niezależna
w pełni zainicjowania typy referencyjne
Potwierdź niezależna przy użyciu Debug.Assert
Niezmienną jest, że masz pewności, warunek jest prawdziwy.Element Debug.Assert (System.Diagnostics) instrukcja jest wywoływana tylko z kompilacjami debugowania aplikacji i nie jest wywoływana z wersji kodu.Jeśli niezmienną warunek nie zostanie spełniony, debuger dzieli w instrukcji potwierdzenia i wyświetla okno dialogowe.Debug.Assert Umożliwia sprawdzenie, czy stan, który nie został zmieniony podczas tworzenia aplikacji.Potwierdzenia dokumentów również dla innych użytkowników, którzy odczytu kodzie, że stan zawsze musi być true.
Na przykład MakeEngineFaster metody zakłada się, że jego engine parametr nigdy nie będzie mieć wartość null ponieważ jej tylko metodę obiektu wywołującego (TheOnlyCallerOfMakeEngineFaster) jest znany lepiej zainicjować EngineInfo.Potwierdzenia w MakeEngineFaster dokumenty założeniu i umożliwia sprawdzanie, czy założenie jest true.
Jeśli inna osoba zamieści nową metodę obiektu wywołującego (BadNewCallerOfMakeEngineFaster) nie inicjuje parametru, zostanie wywołany potwierdzenia.
private void TheOnlyCallerOfMakeEngineFaster()
{
var engine = new EngineInfo();
engine.Power = "GAS";
engine.Size = 1.5;
MakeEngineFaster(engine);
}
private void MakeEngineFaster(EngineInfo engine)
{
System.Diagnostics.Debug.Assert(engine != null, "Assert: engine != null");
engine.Size *= 2;
Console.WriteLine("The engine is twice as fast");
}
private void BadNewCallerOfMakeEngineFaster()
{
EngineInfo engine = null;
MakeEngineFaster(engine);
}
Public Sub TheOnlyCallerOfMakeEngineFaster()
Dim engine As New EngineInfo
engine.Power = "GAS"
engine.Size = 1.5
MakeEngineFaster(engine)
End Sub
Private Sub MakeEngineFaster(engine As EngineInfo)
System.Diagnostics.Debug.Assert(engine IsNot Nothing, "Assert: engine IsNot Nothing")
engine.Size = engine.Size * 2
Console.WriteLine("The engine is twice as fast")
End Sub
Public Sub BadNewCallerOfMakeEngineFaster()
Dim engine As EngineInfo = Nothing
MakeEngineFaster(engine)
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
W pełni zainicjowania typów odniesienia
Aby uniknąć wielu NullReferenceExceptions, w pełni zainicjować typów odniesienia jako najbliższa ich tworzenie możliwie.
Dodaj pełną inicjowania do własnych klas
Jeśli kontrolę nad klasa, która zgłasza wyjątek NullReferenceException, należy wziąć pod uwagę w pełni inicjowania obiektu w konstruktora typu.Na przykład w tym miejscu jest poprawionej wersji klasy z przykładu, która gwarantuje pełną inicjowania:
public class Automobile
{
public EngineInfo Engine { get; set; }
public Automobile()
{
this.Engine = new EngineInfo();
}
public Automobile(string powerSrc, double engineSize)
{
this.Engine = new EngineInfo(powerSrc, engineSize);
}
}
public class EngineInfo
{
public double Size {get; set;}
public string Power {get; set;}
public EngineInfo()
{
// the base engine
this.Power = "GAS";
this.Size = 1.5;
}
public EngineInfo(string powerSrc, double engineSize)
{
this.Power = powerSrc;
this.Size = engineSize;
}
}
Public Class Automobile
Public Property Engine As EngineInfo
Public Sub New()
Me.Engine = New EngineInfo()
End Sub
Public Sub New(powerSrc As String, engineSize As Double)
Me.Engine = New EngineInfo(powerSrc, engineSize)
End Sub
End Class
Public Class BaseEngineInfo
Public Sub New()
' the base engine
Me.Power = "GAS"
Me.Size = 1.5
End Sub
Public Sub New(powerSrc As String, engineSize As Double)
Power = powerSrc
Size = engineSize
End Sub
Public Property Size() As Double
Public Power As String = String.Empty
End Class
[!UWAGA]
Użyj inicjowania z opóźnieniem dla dużych lub rzadko używanych właściwości
Zmniejszenie zużycia pamięci, klasy i zwiększyć wydajność, należy wziąć pod uwagę przy użyciu inicjowania z opóźnieniem właściwości typu odwołania.Zobacz Inicjalizacja z opóźnieniem.
Obsługa NullReferenceExceptions w kodzie zlecenia
Sprawdź wartość null (NIC w języku Visual Basic), przed użyciem typu odwołania
Użyj spróbuj — catch — koniec (spróbuj — Catch — koniec w języku Visual Basic) do obsługi wyjątku
Jest lepsze uniknąć NullReferenceException niż można je obsłużyć po jego wystąpieniu.Obsługa wyjątku mogą wysyłać trudniejsze do utrzymywania i zrozumieć swój kod, a niekiedy można wprowadzać innych usterek.NullReferenceException często jest to nieodwracalny błąd.W takich sytuacjach czekać na wyjątek zatrzymać aplikacji może być najlepsze alternatywne.
Jednak istnieje wiele sytuacji, w której obsługi błędu może być przydatne:
Twoja aplikacja można zignorować obiektów, które mają wartość null.Na przykład jeśli Twoja aplikacja pobiera i przetwarza rekordów w bazie danych, można zignorować pewną liczbę nieprawidłowych rekordów spowodować obiektów wartości null.Rejestrowanie złe dane w pliku dziennika lub interfejsu użytkownika aplikacji może być wszystko, co trzeba zrobić.
Użytkownik może otrzymać od wyjątek.Na przykład wywołania usługi sieci web, która zwraca typ odwołania może zwrócić wartość null, jeśli połączenie zostanie przerwane lub upłynął limit czasu połączenia.Można spróbować ponownie ustanowić połączenie i spróbuj ponownie.
Nieprawidłowy stan można przywrócić stanu aplikacji.Na przykład możesz może być wykonywane wielu kroku zadanie, które wymaga zapisania informacji o magazynie danych przed wywołaniem metody, która zgłasza wyjątek NullReferenceException.Jeśli Niezainicjowany obiekt może nastąpić uszkodzenie rekordu danych, można usunąć poprzednie dane przed zamknięciem aplikacji.
Chcesz zgłosić wyjątek.Na przykład jeśli błąd został spowodowany przez pomyłkę przez użytkownika aplikacji, można wygenerować komunikatu pomóc mu podać prawidłowe informacje.Można także rejestrować informacje o błędzie, aby pomóc w rozwiązaniu problemu.Niektóre struktury, takich jak ASP.NET, ma wysokiego poziomu wyjątek program obsługi, który przechwytuje wszystkie błędy, do którego aplikacja nigdy nie awarii; w takim przypadku rejestrowania wyjątku może być jedynym sposobem wiesz, że występuje.
Poniżej przedstawiono dwa sposoby obsługi NullReferenceException w wersji kodu.
Sprawdź wartość null (NIC w języku Visual Basic) przed użyciem typu odwołania
Za pomocą jawnego testu dla wartości null, przed użyciem obiektu pozwala uniknąć ograniczeń wydajności spróbuj catch-na koniec konstrukcji.Jednak nadal należy określić i implementować co zrobić w odpowiedzi na niezainicjowanego obiektu.
W tym przykładzie CheckForNullReferenceFromMethodReturnValue sprawdzenie, zwracana wartość BadGetEngineInfo metody.Jeśli obiekt nie jest równa null, jest ona używana; w przeciwnym razie metoda zgłasza błąd.
public EngineInfo BadGetEngineInfo()
{
EngineInfo engine = null;
return engine;
}
public void CheckForNullReferenceFromMethodReturnValue()
{
var engine = BadGetEngineInfo();
if(engine != null)
{
// modify the info
engine.Power = "DIESEL";
engine.Size = 2.4;
}
else
{
// report the error
Console.WriteLine("BadGetEngine returned null")
}
}
public EngineInfo BadGetEngineInfo()
{
EngineInfo engine = null;
return engine;
}
Public Sub CheckForNullReferenceFromMethodReturnValue()
Dim engine = BadGetEngineInfo()
If (engine IsNot Nothing) Then
' modify the info
engine.Power = "DIESEL"
engine.Size = 2.4
Else
' report the error
Console.WriteLine("BadGetEngineInfo returned Nothing")
End If
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Użyj spróbuj catch-na koniec (spróbuj-Catch-koniec w języku Visual Basic) do obsługi wyjątku
Przy użyciu wbudowanej obsługi konstrukcje wyjątków (Spróbuj, łap na koniec w języku C#, Spróbuj, Catch, na koniec w języku Visual Basic) oferuje jeden z opcjami NullReferenceExceptions niż sprawdzania, czy obiekt nie jest równa null.
W tym przykładzie CatchNullReferenceFromMethodCall używa dwóch potwierdza, aby upewnić się, przy założeniu, że jego parametr zawiera pełną samochód, łącznie z aparatu.W try bloku, zaznaczony wiersz zgłasza NullReferenceException, ponieważ połączenie RarelyBadEngineSwap można usunięcie samochód Engine Właściwości.catch Bloku przechwytuje wyjątek zapisuje informacje o wyjątku do pliku i zgłasza błąd do użytkownika.W finally bloku, metoda uzyskanie, że stan samochód jest nie niższa niż rozpoczęcia metody.
public void RarelyBadSwapCarEngine(Automobile car)
{
if ((new Random()).Next() == 42)
{
car.Engine = null;
}
else
{
car.Engine = new EngineInfo("DIESEL", 2.4);
}
}
public void CatchNullReferenceFromMethodCall(Automobile car)
{
System.Diagnostics.Debug.Assert(car != null, "Assert: car != null");
System.Diagnostics.Debug.Assert(car.Engine != null, "Assert: car.Engine != null");
// save current engine properties in case they're needed
var enginePowerBefore = car.Engine.Power;
var engineSizeBefore = car.Engine.Size;
try
{
RarelyBadSwapCarEngine(car);
var msg = "Swap succeeded. New engine power source: {0} size {1}";
Console.WriteLine(msg, car.Engine.Power, car.Engine.Size);
}
catch(NullReferenceException nullRefEx)
{
// write exception info to log file
LogException(nullRefEx);
// notify the user
Console.WriteLine("Engine swap failed. Please call your customer rep.");
}
finally
{
if(car.Engine == null)
{
car.Engine = new EngineInfo(enginePowerBefore, engineSizeBefore);
}
}
}
Public Sub RarelyBadSwapCarEngine(car As Automobile)
If (New Random()).Next = 42 Then
car.Engine = Nothing
Else
car.Engine = New EngineInfo("DIESEL", 2.4)
End If
End Sub
Public Sub CatchNullReferenceFromMethodCall(car As Automobile)
System.Diagnostics.Debug.Assert(car IsNot Nothing)
System.Diagnostics.Debug.Assert(car.Engine IsNot Nothing)
' save current engine properties in case they're needed
Dim powerBefore = car.Engine.Power
Dim sizeBefore = car.Engine.Size
Try
RarelyBadSwapCarEngine(car)
Dim msg = "Swap succeeded. New engine power source: {0} size {1}"
Console.WriteLine(msg, car.Engine.Power, car.Engine.Size)
Catch nullRefEx As NullReferenceException
' write exception info to log file
LogException(nullRefEx)
' notify user
Console.WriteLine("Engine swap failed. Please call your customer rep.")
Finally
If car.Engine Is Nothing Then car.Engine = New EngineInfo(powerBefore, sizeBefore)
End Try
End Sub
Wpisy w tej sekcji
Sekcje w tym artykule
Artykuły o podobnej tematyce
zwracania wyjątków (oprogramowania Essentials aplikacji .NET Framework) i obsługi
jak: Otrzymuj powiadomienia pierwszej szansy wyjątek (Podręcznik programowania .NET Framework)
jak: obsługi wyjątków w zapytaniu PLINQ (Podręcznik programowania .NET Framework)
Wyjątków w zarządzanych wątków (Podręcznik programowania .NET Framework)
wyjątków i obsługi wyjątków (C# Programming Guide)
instrukcji (C# odwołania) do obsługi wyjątków
Spróbuj...CATCH...Na koniec instrukcji (Visual Basic)
(równoległe Biblioteka) obsługi wyjątków
obsługi (debugowanie) wyjątków
Instruktaż: Obsługa wyjątek współbieżności (Uzyskiwanie dostępu do danych w programie Visual Studio)
jak: obsługi błędów i wyjątków, które występują z wiązania danych (Windows Forms)
Obsługa wyjątków w aplikacjach sieci (XAML) (z Windows)
Sekcje w tym artykule