Udostępnij za pośrednictwem


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

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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.

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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.

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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.

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku 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

Powrót do początku Wpisy w tej sekcji

Powrót do początku Sekcje w tym artykule

Artykuły o podobnej tematyce

Projektowania wytyczne dotyczące wyjątków (wytyczne dotyczące projektowania platformy .NET Framework)

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)

obsługi (F #) wyjątków

Wyjątki C + +/ CLI

(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)

Powrót do początku Sekcje w tym artykule