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时,程序崩溃并给我们以下错误:
附加信息:对象引用未设置为的实例 宾语。 如果存在此异常的处理程序,则程序可能是安全的 继续进行。
请帮忙!
答案 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
};
}
}