未处理的异常“System.IndexOutOfRangeException”

时间:2017-10-08 21:15:04

标签: vb.net indexoutofrangeexception

Module Module1

'input vars declarations
Private DescriptionString As String
Private StockNumberString As String
Private WholesalePriceDecimal As Decimal
Private QuantityOHDecimal As Decimal

'CONSTANT VAR
Private Const PROFIT_PERCENT_DECIMAL As Decimal = 0.25

'calculated vars declarations
Private InvValueDecimal As Decimal 'this is WholesalePrice * QOH
Private PotentialProfit As Decimal 'this is InvValue * PROFIT_PERCENT
Private PotentialIncome As Decimal 'this is InvValue + PotentialProfit

'declares the record variable and associates file name
Private CurrentRecord()
Private FurnitureInventoryFile As New FileIO.TextFieldParser("FURNFILE.TXT")

'Main module is Level 1
Sub Main()

    'L1 calls L2

    Call Housekeeping()

    Do While Not FurnitureInventoryFile.EndOfData
        Call ProcessRecords()
    Loop

    Call EndOfJob()

End Sub

'L2 Housekeeping() calls L3 SetFileDelimiter() and L3 WriteHeadings()
Private Sub Housekeeping()

    Call SetFileDelimiter()
    Call WriteHeadings()

End Sub

'L2 ProcessRecords() calls L3 ReadFile(), L3 DetailCalculations() and L3 WriteDetailLine()
Private Sub ProcessRecords()

    Call ReadFile()
    Call DetailCalculations()
    Call WriteDetailLine()

End Sub

'L2 EndOfJob() calls L3 SummaryOutput() and L3 CloseFile()
Private Sub EndOfJob()

    Call SummaryOutput()
    Call CloseFile()

End Sub

'L3, Called by Housekeeping(), Assigns filetype as delimited and assigns the delimiter as a comma
Private Sub SetFileDelimiter()

    FurnitureInventoryFile.TextFieldType = FileIO.FieldType.Delimited
    FurnitureInventoryFile.SetDelimiters(",")

End Sub

'L3, Called by Housekeeping(), Writes the report heading and column heading lines
Private Sub WriteHeadings()

    'Report Headings
    Console.WriteLine(Space(17) & "Inventory Report for Quality Furniture Store")
    Console.WriteLine(Space(28) & "Christian VanderHorst")

    '2 Blank lines
    Console.WriteLine()
    Console.WriteLine()

    'Column Headings
    Console.WriteLine(Space(22) & "Stock" & Space(8) & "Wholesale" & Space(2) & "Inventory" & Space(2) & "Potential" & Space(3) & "Potential")
    Console.WriteLine(Space(1) & "Description" & Space(10) & "Number" & Space(2) & "QOH" & Space(6) & "Price" & Space(6) & "Value" & Space(5) & "Profit" & Space(6) & "Income")

End Sub

'L3, Called by ProcessRecords(), Reads the file and parses the current record into its vars
Private Sub ReadFile()

    CurrentRecord = FurnitureInventoryFile.ReadFields() 'reads the record

    StockNumberString = CurrentRecord(0)
    DescriptionString = CurrentRecord(1)
    WholesalePriceDecimal = CurrentRecord(2)
    QuantityOHDecimal = CurrentRecord(3)

End Sub

'L3, Calculates InvValueDecimal, PotentialProfitDecimal and PotentialIncomeDecimal
Private Sub DetailCalculations()

    InvValueDecimal = WholesalePriceDecimal * QuantityOHDecimal
    PotentialProfit = InvValueDecimal * PROFIT_PERCENT_DECIMAL
    PotentialIncome = InvValueDecimal + PotentialProfit

End Sub

'L3, Writes the detail lines
Private Sub WriteDetailLine()

    Console.WriteLine(Space(1) & DescriptionString.PadRight(19) &
                      Space(2) & StockNumberString &
                      Space(4) & QuantityOHDecimal.ToString("N0").PadLeft(2) &
                      Space(3) & WholesalePriceDecimal.ToString("N").PadLeft(8) &
                      Space(2) & InvValueDecimal.ToString("N").PadLeft(9) &
                      Space(5) & PotentialProfit.ToString("N").PadLeft(5) &
                      Space(2) & PotentialIncome.ToString("C").PadLeft(10))

End Sub

'L3, Writes the summary line and pauses program to wait for enter keystroke
Private Sub SummaryOutput()

    'Blank space to move the summary line down
    Console.WriteLine()
    Console.WriteLine()

    'the summary line
    Console.WriteLine(Space(24) & "End of Furniture Profit Report")

    'prompt to tell the user how to close the report
    Console.WriteLine()
    Console.WriteLine()
    Console.WriteLine("Press ENTER to close the report")
    Console.ReadLine()

End Sub

'L3, Closes the input file
Private Sub CloseFile()

    FurnitureInventoryFile.Close()

End Sub

结束模块

这是我创建的完整代码。一切正常,但是在输出3条细节线后,它会出现

  

My_Name.InvReportFurniture.exe中发生未处理的“System.IndexOutOfRangeException”类型异常

     

其他信息:索引超出了数组的范围。

并指定声明

  

QuantityOHDecimal = CurrentRecord(3)

作为来源

我似乎无法弄清楚它的原因是什么。如果我在每个细节线写入之间设置一个暂停,它就会像在第三个细节线之后抛出该异常一样。

这是数据文件。

  

ET010,3抽屉结束表,169.00,10   ET020,4抽屉端面,299.95,05
  ET030,8抽屉端面,148.99,12   ST010,堆叠表325.50,20   BC020,4货架书柜,130.99,24
  BC030,5货架书柜,199.95,08
  BC040,6货架书柜,270.99,15
  LC010,休闲椅,198.89,20   VC010,Wingback Chair,320.55,05
  LC011,Pleather Recliner,1050.00,02
  FC010,织物躺椅,755.00,04
  VC015,皮革躺椅,500.01,10   BS010,书架,235.80,05
  LS010,灯架,135.23,15
  PS010,电话支架,99.95,19
  TS010,电视架,270.90,08
  SS010,立体声支架,675.00,15
  TS015,Tiffany Stand,1115.35,02

1 个答案:

答案 0 :(得分:3)

这是因为ST010的行缺少逗号字段分隔符。此行中只有三个字段,因此字段索引3(第四个字段)不存在。