2

I keep getting errors when running the code below. I don't understand what I'm doing wrong

ERROR 1: You cannot call a method on a null-valued expression. At line:25 char:9

ERROR 2: Cannot index into a null array. At line:43 char:1

CODE:

            Class Step {
                [int]$StepNumber = 0
                [string]$Name = ''
                [string]$ScriptFile = ''
                [int]$status = 0 # 0 = 'InComplete', 1 = 'Complete', 2 = 'Failed', -1 = 'Skipped'
                [string]$DependencyStepNumber = -1

                Step([string]$Name, [int]$StepNumber, [string]$ScriptFile) {
                    $this.Name = $Name
                    $this.StepNumber = $StepNumber
                    $this.ScriptFile = $ScriptFile
                }
            }


            Class Guide {
                [int]$StepNumberCounter = 0
                [string]$Name = ''
                [Step[]]$Steps

                [int]AddStep([string]$Name, [string]$ScriptFile) {
                    $newStepNumber = $this.GetNewStepNumber()
                    $newStep = [Step]::new($Name, $newStepNumber, $ScriptFile)

line-25>>>          $this.Steps.Add($newStep)

                    return $newStepNumber
                }

                [int]GetStepName([int]$StepNumber) {
                    return $this.Steps[$StepNumber-1]
                }

                [int]GetNewStepNumber() {
                    return $this.StepNumberCounter += 1
                }
             }

             $Guide = [Guide]::new()
             $Guide.AddStep('Step One','ScriptOne.ps1')
             $Guide.AddStep('Step Two','ScriptTwo.ps1')

line-43>>>   Write-Host $Guide.Steps[0]
             Write-Host $Guide.Steps[1]
1
  • Please indicate which is line 25 and 43. Commented Aug 1, 2018 at 16:18

2 Answers 2

2

Array list has better performance, see below revised code

Class Step {
    [int]$StepNumber = 0
    [string]$Name = ''
    [string]$ScriptFile = ''
    [int]$status = 0 # 0 = 'InComplete', 1 = 'Complete', 2 = 'Failed', -1 = 'Skipped'
    [string]$DependencyStepNumber = -1

    Step([string]$Name, [int]$StepNumber, [string]$ScriptFile) {
        $this.Name = $Name
        $this.StepNumber = $StepNumber
        $this.ScriptFile = $ScriptFile
    }
}


Class Guide {
    [int]$StepNumberCounter = 0
    [string]$Name = ''
    [System.Collections.ArrayList]$Steps = @()

    [int]AddStep([string]$Name, [string]$ScriptFile) {
        $newStepNumber = $this.GetNewStepNumber()
        $newStep = [Step]::new($Name, $newStepNumber, $ScriptFile)

        $this.Steps.Add($newStep)

        return $newStepNumber
    }

    [int]GetStepName([int]$StepNumber) {
        return $this.Steps[$StepNumber-1]
    }

    [int]GetNewStepNumber() {
        return $this.StepNumberCounter += 1
    }
}

$Guide = [Guide]::new()

$Guide.AddStep('Step One','ScriptOne.ps1')
$Guide.AddStep('Step Two','ScriptTwo.ps1')

Write-Output $Guide.Steps[0]
Write-Output $Guide.Steps[1]
Sign up to request clarification or add additional context in comments.

1 Comment

Yes, this solves it with my original intent of using an ArrayList, thanks.
2

To add an element to an array, we use the += operator.

$this.Steps += $newStep

Add is reserved for ArrayList:

$al = New-Object System.Collections.ArrayList
$al.Add('Example')

2 Comments

Jean-Claude Colette is correct, switch to using += instead of Add().
Thanks! That was it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.