您不能在空值表达式上调用方法 - 一般

时间:2015-07-10 07:43:30

标签: powershell nullpointerexception null

你创建一个脚本,它工作了一段时间,然后突然开始崩溃“你不能在空值表达式上调用一个方法”或者在这个对象上找不到“属性'属性名'确认该属性存在且可以设置。“这是什么意思?

1 个答案:

答案 0 :(得分:2)

这是"空指针异常"的Powershell版本。每次尝试查询看似为null的变量时都会出现此异常。要确定哪个变量为null以及在哪里,您需要读取堆栈跟踪以及相关行的行/符号编号。一个例子:

You cannot call a method on a null-valued expression.
At E:\temp\testsest.ps1:35 char:12
+         If($Search.value() -contains $SearchString)
 +            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

让我们解析错误信息。首先,这个问题的标题中有一个措辞。如果您要使用此措辞提出问题,您将获得StackOverflow提出的一组类似问题。但错误描述中还有更多内容。第二行显示生成此异常的表达式的第一个字符的脚本,行和字符编号。在此,请求$Search.value()查询-contains $SearchString。波浪下划线将表达式完全分开,尽管正确的方法只是强调$Search.value()。接下来,有一个CategoryInfoFullyQualifiedErrorId,后者说"在null"上调用方法,省略"指针"或"变量"。

现在,让我们调试一下这条消息。这里,唯一要调用的方法是value(),这意味着$Search等于null。因此,我们需要从脚本的第35行向上查找并找到最后一个值分配给相关变量的位置。此特定脚本具有Range.Find()的查询,如果与搜索到的字符串不匹配,则返回null。摘录:

$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$ExcelWorkBook = $Excel.Workbooks.Open($ExcelPath)
$ExcelWorkSheet = $Excel.WorkSheets.item("$location")


$Range = $ExcelWorkSheet.Range("A1").EntireColumn
$Search = $Range.find($user) # <<< here we get null

If($Search.value() -contains $user) 

所以,我们发现我们在哪里收到null。

补救措施各不相同,但都包含针对$null的检查。在这种情况下,它足以检查$Search是否为null,并返回&#34;没有找到&#34;如果确实是空的。它可能不是那么简单,可能有更多结构可以为空,如$a.b.c.someMethod() - 这里$a$a.b$a.b.c为空,所以你需要检查所有结果。还有一些情况会返回复杂的结构,并且预期在某个字段中有一个值,但该字段未填充,因此尝试使用该字段的值将产生异常。

道德是:如果你收到一个关于&#34; null-valued&#34;的异常,你没有想到某些东西会返回null,你必须添加对null的检查(或者,事实上,任何意外的)在尝试使用结果之前的值。