2015-09-28 3 views
0
private Employee searchForEmployee(int ID) 
{ 
    var EmployeeDetails = (from emp in EmployeeArray 
          where emp.m_EmployeeId == ID 
          select emp).FirstOrDefault(); 
    if (EmployeeDetails != null) 
    { 
     return EmployeeDetails; 
    } 
    else 
    { 
     return null; 
    } 
} 

Вопрос (извините за плохой формат, Im новой для этого и Linq):Создание SearchBar с помощью LINQ продолжает врезаться

Мы, кажется, получают всю информацию, когда ID матча, но когда нет соответствующего идентификатора, который программа просто выходит из строя и дает нам следующую ошибку:

Additional information: Object reference not set to an instance of an object. If there is a handler for this exception, the program may be safely continued.

Помогите!

+2

Возможно, потому что вы возвращаете 'null'? – Backs

+0

Как вы используете возвращаемое значение из этого метода? –

+0

С этим кодом нет ничего плохого (ничего, что могло бы вызвать исключение). Если что-то вызывает 'searchForEmployee' и пытается ссылаться на возвращаемое свойство null, вы получите это исключение. –

ответ

1

We seem to be getting all the information when the ID matches, but when there is no matching ID the program just crashes and gives us the following error.

Это имеет смысл. Учитывая ваш код, если для данного Employee нет соответствия его Id, вы возвращаете null. Следовательно, если вы сделаете это:

var employee = SearchForEmployee(1); 

// Attempting to access the Id propery on a null value will throw. 
Console.WriteLine(employee.Id); 

Тогда что будет через ЯРД, потому что возвращаемое значение было null. Вам нужно добавить нулевой чек код:

var employee = SearchForEmployee(1); 
if (employee != null) 
    Console.WriteLine(employee.Id); 

Или, вы можете использовать C# -6 нулевой условный оператор:

var employee = SearchForEmployee(1); 
Console.WriteLine(employee?.Id); 

Примечание стороны - Ваш null проверка внутри SearchForEmployee является излишним, как вы return null в любом случае, если нет совпадения. Это будет делать:

private Employee SearchForEmployee(int Id) 
{ 
    return (from emp in EmployeeArray 
    where emp.m_EmployeeId == Id 
    select emp).FirstOrDefault(); 
} 

Или снова, используя C# -6:

private Employee SearchForEmployee(int Id) => 
          EmployeeArray.FirstOrDefault(emp => emp.m_EmployeeId == Id); 

Редактировать:

Из комментариев:

Looks like this: private Employee[] EmployeeArray = new Employee[50]; It is created when the windows form loads up, and it is only initialized when an employee is registered. We are using this method after atleast one employee was added.

Ну да, только инициализацией массив, но не ссылки, которые хранятся внутри этого массива. Это означает, что у вас может быть только один объект Employee, но у вас есть еще 49, которые нет.

У вас есть два варианта, либо изменить ваш запрос, чтобы включить null проверки:

private Employee SearchForEmployee(int Id) 
{ 
    return EmployeeArray.FirstOrDefault(emp => emp != null && emp.m_EmployeeId == Id); 
} 

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

+0

Эй, спасибо за ответ так быстро. Где именно я должен это поставить? Он продолжает срываться с момента, когда он попадает в раздел «где». Должен ли я запускать нулевой чек? Если да, то как это должно быть написано? Редактировать: Просто обновился, и я вижу, что вы написали еще кое-что, я смотрю в него. –

+0

@OzFranko Если он сбой в вашем предложении 'where', то ваш массив, вероятно, не инициализирован. Как вы создаете «EmployeeArray»? –

+0

Похоже на то: частный сотрудник [] EmployeeArray = new Employee [50]; Он создается, когда форма окон загружается, и она инициализируется только при регистрации сотрудника. Мы используем этот метод после того, как по крайней мере один сотрудник был добавлен. –

0

Метод, который вы опубликовали, не вызывает ошибку. Где-то в вашем коде вы вызываете метод, возвращающий значение null. Затем вы пытаетесь получить доступ к одному из его свойств, и поскольку объект имеет значение null, вы получаете эту ошибку. Например, вы, вероятно, что-то вроде этого:

Employee emp = searchForEmployee(18); 
string name = emp.Name; //This will throw an error if no employee exists with id of 18 

В результате Вы должны проверить, если эй не нулевая первый как таковые:

if(emp != null) 
{ 
    string name = emp.Name; 
} 

Конечно, я просто угадывать, если имя является но вы должны понять.То, что вы также можете сделать, - это изменить метод, чтобы он возвращал объект сотрудника по умолчанию, если вы скорее не возвращаете значение null. Что-то вроде этого:

private Employee searchForEmployee(int ID) 
{ 
    var EmployeeDetails = (from emp in EmployeeArray 
          where emp.m_EmployeeId == ID 
          select emp).FirstOrDefault(); 
    if (EmployeeDetails != null) 
    { 
     return EmployeeDetails; 
    } 
    else 
    { 
     return new Employee 
     { 
      ID = 0, 
      Name = "default", //etc 
     }; 
    } 
} 
Смежные вопросы