C# Cognex,为啥他说空引用异常 [重复]

Posted

技术标签:

【中文标题】C# Cognex,为啥他说空引用异常 [重复]【英文标题】:C# Cognex ,why he say null reference exception [duplicate]C# Cognex,为什么他说空引用异常 [重复] 【发布时间】:2019-06-27 04:47:38 【问题描述】:

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】:

这个错误是因为.Resultsnull,但是你试图调用它的GetCircle() 方法。

处理此问题的一种方法是使用null-conditional operator (?.),如果左侧为 null,则返回 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),否则将评估条件Visible == true

if (CogFindCircleTool_.Results?.GetCircle()?.Visible == true)

在 cmets 中,您声明您在 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() + ")");

提高性能的一件事是捕获一次GetCircle() 方法的结果,而不是一遍又一遍地调用它,这需要额外的处理周期。这也将使代码更短且更具可读性。您也可以使用string interpolation 代替串联来进一步缩短代码。

你还提到你仍然在内线得到一个空引用异常,这可能只意味着Label 是空的(据我所知)。如果是这样,我们可以在调用SetXYText 方法时使用?. 运算符:

// 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))");

请注意,如果某些内容为空,上面的代码将不会执行任何操作。如果您想在circlenullLabelnull 时做其他事情,那么您应该明确检查而不是使用?. 运算符:

if (circle == null) 
 
    // do something if circle is null 
 
else if (circle.Visible == true) 
 
    if (Label == null) 
     
        // do something if Label is null 
     
    else 
     
        Label.SetXYText(circle.CenterX, circle.CenterY, 
            $"(Math.Round(circle.CenterX, 3),Math.Round(circle.CenterY, 3))");
     

【讨论】:

但是我之前跑过成功。 我只是尝试运行你所说的,但下一行 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() + ")");他还是说空 我现在不明白是什么时候CogFindCircleTool_.run(),他应该记录值。 首先您应该捕获一次GetCircle 的值,而不是一遍又一遍地调用该方法。也不要试图在一行中做这么多。把它拆开,这样你就可以看到它落在哪里了 我用可能有帮助的代码示例更新了答案。

以上是关于C# Cognex,为啥他说空引用异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

HTTP客户端NoCache标志导致空引用异常C# [重复]

为啥不能在主线程中直接捕获和处理工作线程抛出的异常?

什么时候在 C# 中返回空引用类型是正确的 [重复]

C#,FindControl [重复]

为啥 java hashCode() 中经常使用异或,而很少使用其他位运算符?

glCreateShader 在 OSX 上抛出异常,为啥?