使用LINQ创建搜索栏会导致崩溃

时间:2015-09-28 14:40:20

标签: c# linq crash

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;
    }
}

问题(抱歉格式不好,我对此和Linq不熟悉):

我们似乎在ID匹配时获取所有信息,但是当没有匹配的ID时,程序崩溃并给我们以下错误:

  

附加信息:对象引用未设置为的实例   宾语。   如果存在此异常的处理程序,则程序可能是安全的   继续进行。

请帮忙!

2 个答案:

答案 0 :(得分:1)

  

我们似乎在ID匹配时获取所有信息,但是   当没有匹配的ID时,程序就会崩溃并给我们提供   跟随错误。

这很有道理。根据您的代码,如果Employee的给定Id不匹配,则返回null。因此,如果你这样做:

var employee = SearchForEmployee(1);

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

然后通过NRE,因为返回值为null。您需要在代码中添加空检查:

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

或者,您可以使用C#-6 null条件运算符:

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

旁注 - null SearchForEmployee内的null检查是多余的,因为如果没有匹配,您仍会返回private Employee SearchForEmployee(int Id) { return (from emp in EmployeeArray where emp.m_EmployeeId == Id select emp).FirstOrDefault(); } 。这样做:

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

或者再次使用C#-6:

private Employee[] EmployeeArray = new Employee[50];

修改

来自评论:

  

看起来像这样:Employee   它是在窗体加载时创建的,而仅是   员工注册时初始化。我们正在使用这种方法   在至少一名员工加入后。

那么,你只能初始化数组,而不是存储在该数组中的引用。这意味着您可能在那里初始化了一个null对象,但是您还有另外49个未初始化的对象。

您有两个选项,可以修改您的查询以包含private Employee SearchForEmployee(int Id) { return EmployeeArray.FirstOrDefault(emp => emp != null && emp.m_EmployeeId == Id); } 支票:

List<Employee>

或者您可以改为使用Code: import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Clock extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage ps) throws Exception { ps.setTitle("Analog Clock"); ps.show(); StackPane pane = new StackPane(); pane.setAlignment(Pos.CENTER); ImageView image = new ImageView(new Image(getClass().getResourceAsStream("analog.png"))); pane.getChildren().add(image); //Image img = new Image("analog.png"); // ImageView iv1 = new ImageView(); // iv1.setImage(img); Scene scene = new Scene(pane); ,这意味着它只会包含您已添加的员工,并且会在您向其添加更多员工时动态调整大小,而无需额外的工作。< / p>

答案 1 :(得分:0)

您发布的方法不会抛出错误。在代码中的某处,您正在调用该方法,该方法返回null。然后,您尝试访问其中一个属性,并且由于该对象为null,因此您会收到该错误。例如,你可能有这样的东西:

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

因此,您需要首先检查emp是否为空:

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
        };
    }
}