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】:这个错误是因为.Results
是null
,但是你试图调用它的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
。
下面,如果Results
是null
或GetCircle
返回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))");
请注意,如果某些内容为空,上面的代码将不会执行任何操作。如果您想在circle
是null
或Label
是null
时做其他事情,那么您应该明确检查而不是使用?.
运算符:
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# [重复]