2015-07-10 36 views
2

您可以創建一段腳本,它可以工作一段時間,然後突然變爲「您無法在空值表達式上調用方法」或「在該對象上找不到屬性的屬性名稱」,驗證屬性是否存在並可以設置。「這是什麼意思?您無法調用空值表達式的方法 - 一般

回答

2

這是「空指針異常」的Powershell版本。每次嘗試查詢顯示爲空的變量時都會出現此異常。要確定哪個變量是空的,哪裏,你需要讀取堆棧軌跡和該行中的行/符號號。舉例:

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,後者說「空值調用方法」,省略「指針」或「變量」。

現在,我們來調試消息。在這裏,即將被調用的唯一方法是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,則返回「Nothing found」。這可能不是那麼簡單,可能有更多的結構可能爲空,如在$a.b.c.someMethod()中 - 此處爲$a,$a.b$a.b.c爲空,因此您需要檢查所有結果。還有一種情況是,返回一個複雜的結構,並且預期在某個字段中具有值,但該字段未填充,因此嘗試使用該字段的值會產生異常。

道德是:如果您收到一個關於「無效值」的例外說法,您並沒有預料到返回null的情況,並且您必須在嘗試之前添加對空值(或實際上任何意外)值的檢查使用結果。

相關問題