2013-12-21 2 views
1

Когда я запускаю код он дает мне эту ошибку:Как устранить исключение NullReferenceException при использовании двух отдельных классов?

An exception of type 'System.NullReferenceException' occurred in App.dll but was not handled in user code 

Additional information: Object reference not set to an instance of an object. 

Как бы решить эту проблему?

ExceptionHandling ExManager = new ExceptionHandling(); 
var Message = ExManager.ExceptionLibrary["10000"]// occured here 

класс ExceptionHandling

public class ExceptionHandling 
{ 
    private Dictionary<string, string> exceptionlibrary; 
    public Dictionary<string, string> ExceptionLibrary 
    { 
     get { return exceptionlibrary; } 
     set 
     { 
      exceptionlibrary = new Dictionary<string, string>() 
      { 
       //User 
       {"10000", "Invalid user input."}, 
       {"10001", "Phone number is already registered."},        
      }; 
     } 
    } 
} 

ответ

0

«set» никогда не вызывается, и поэтому exceptionLibrary имеет значение null, когда вы «получаете» его.

Возможно, это лучший способ:

public class ExceptionHandling 
{ 
    private Dictionary<string, string> exceptionlibrary = new Dictionary<string, string>  
     { 
      //User 
      {"10000", "Invalid user input."}, 
      {"10001", "Phone number is already registered."}, 
     }; 

    public Dictionary<string, string> ExceptionLibrary 
    { 
     get { return exceptionlibrary; } 
    } 
} 
0

По вашему коду:

var Message = ExManager.ExceptionLibrary[10000]// occured here 

ясно, что ExManager.ExceptionLibrary является null, потому что это конкретизируется неправильно в инкубаторе, что, вероятно, никогда не б/у. Вы можете установить ExceptionLibrary в конструкторе, а затем сеттер больше не нужен:

public class ExceptionHandling 
{ 
    public ExceptionHandling() 
    { 
     exceptionlibrary = new Dictionary<string, string>() 
     { 

      //User 
      {"10000", "Invalid user input."}, 
      {"10001", "Phone number is already registered."}, 


     }; 
    } 

    private Dictionary<string, string> exceptionlibrary; 
    public Dictionary<string, string> ExceptionLibrary 
    { 
     get { return exceptionlibrary; } 
    } 

Примечание: сеттер, который не используется value, скорее всего, неправильно используется и должен быть rethinked снова.

0

Этот фрагмент кода здесь

set 
{ 
    exceptionlibrary = new Dictionary<string, string>() 
     { 
      //User 
      {"10000", "Invalid user input."}, 
      {"10001", "Phone number is already registered."}, 
     }; 
} 

не вызывается кем-либо, так что ссылка ExceptionLibrary является null.

Прежде чем ссылаться на это свойство, вы должны вызвать setter, или, возможно, выполнить инициализацию внутри конструктора.

0

Установщик свойство только активируется, когда значение присваивается свойству

ExManager.ExceptionLibrary = null; // For example 

Потому что вы этого не сделаете, что ваш словарь никогда не будет инициализироваться. Инициализируйте его так же и удалите установщик, потому что вам, вероятно, не нужно будет назначать ему другой словарь.

public class ExceptionHandling 
{ 
    private Dictionary<string, string> exceptionlibrary = 
     new Dictionary<string, string>() { 
      {"10000", "Invalid user input."}, 
      {"10001", "Phone number is already registered."}, 
     }; 

    public Dictionary<string, string> ExceptionLibrary 
    { 
     get { return exceptionlibrary; } 
    } 
} 

Вместо этого вы также можете использовать ленивую инициализацию

public Dictionary<string, string> ExceptionLibrary 
{ 
    get { 
     if (exceptionlibrary == null) { 
      exceptionlibrary = new Dictionary<string, string>() { 
       {"10000", "Invalid user input."}, 
       {"10001", "Phone number is already registered."}, 
      }; 
     } 
     return exceptionlibrary; 
    } 
} 

или вы можете инициализировать словарь в конструктор класса.

0

Правильное решение заключается в том, чтобы использовать ваш отладчик, установив точку останова на линии, в которой произошло исключение, а затем повторно отлаживает приложение/код.

Когда точка останова ударяется, вы «входите» в код, строко за строкой и проверяете переменные на этом пути. Вы можете проверить их в визуальной студии, наведя курсор мыши или перетащив их в окно просмотра. Вы также можете щелкнуть правой кнопкой мыши и «Добавить часы».

Эта тактика должна помочь в разрешении любого типа исключения, особенно если причина в том, что у меня несколько уровней в коде, или когда это вызывает одно из нескольких выражений в одной строке кода.

Надеюсь, что это поможет!

Смежные вопросы