C#Cognex,为什么说空引用异常

时间:2019-02-03 02:00:02

标签: c# vision

enter image description here

代码:

CogFindCircleLastRunRecordConstants.BestFitCircle;
        CogFindCircleTool_.Run();

        if ((CogFindCircleTool_.Results.GetCircle() != null) && (CogFindCircleTool_.Results.GetCircle().Visible == true))
        {
            cogRecordDisplay1.Record = CogFindCircleTool_.CreateLastRunRecord().SubRecords["InputImage"];

1 个答案:

答案 0 :(得分:0)

此错误是因为.Resultsnull,但你试图调用GetCircle()方法就可以了。

一种解决方法是使用null-conditional operator?.),如果左侧为空,则返回null,否则继续右侧的方法或属性手侧:

// If Results is null, the call to GetCircle will not happen, and the result will be null
// Not needed on the second condition, since '&&' would return 'false' right away
if ((CogFindCircleTool_.Results?.GetCircle() != null) &&  
    (CogFindCircleTool_.Results.GetCircle().Visible == true))

您可以通过在访问.?属性时添加另一个Visible来进一步缩短代码,然后我们不需要先显式检查.GetCircle() != null

下面,如果ResultsnullGetCircle返回null,则表达式将失败(因为null != true),否则条件为{{1} }将被评估:

Visible == true

在评价你说,你有if (CogFindCircleTool_.Results?.GetCircle()?.Visible == true) 语句内这样的行:

if

提高性能的一件事是一次捕获Label.SetXYText(CogFindCircleTool_.Results.GetCircle().CenterX, CogFindCircleTool_.Results.GetCircle().CenterY, "(" + Math.Round(CogFindCircleTool_.Results.GetCircle().CenterX, 3).ToString() + "," + Math.Round(CogFindCircleTool_.Results.GetCircle().CenterY, 3).ToString() + ")"); 方法的结果,而不是一遍又一遍地调用它,这需要额外的处理周期。这也将使代码更短,更易读。还可以使用string interpolation而不是级联缩短代码多一点。

您还提到,内线仍然收到null引用异常,这仅意味着GetCircle()为null(据我所知)。如果是这样,我们可以在调用Label方法时使用?.运算符:

SetXYText

请注意,如果某些内容为null,则上面的代码将不执行任何操作。如果您想在// Capture the result of GetCircle() once var circle = CogFindCircleTool_?.Results?.GetCircle(); if (circle?.Visible == true) { Label?.SetXYText(circle.CenterX, circle.CenterY, $"({Math.Round(circle.CenterX, 3)},{Math.Round(circle.CenterY, 3)})"); } circlenullLabel的情况下做其他事情,则应该显式检查而不是使用null运算符:< / p>

?.