以下程序验证供应商文件.
以下是规则:
当时处理1供应商
验证以下3个方案(供应商发送文件,未发送文件,发送过多文件)
将验证结果存储在InvoiceFileValidationClass类中
名为"Files"的InvoiceFileValidationClass的1个类成员是"ArhiveFilesClass"类型的列表
成员"文件"需要存储多个文件名以进行存档
将值添加到InvoiceFileValidationClass的所有其他成员不是问题
向成员"Files"添加值会在以下代码行中生成null异常: ValidateFileCount.Files.Add(temp)
关于如何避免null异常的任何想法?
Public Class InvoiceFileValidationClass Public VendorName As String Public FileName As String Public FileCount As InvoiceFileCount Public FileContent As InvoiceFileContent Public ErrorMessage As String Public Files As List(Of ArhiveFilesClass) End Class Public Class ArhiveFilesClass Public OriginalFilePathandName As String Public ArchiveFilePathandName As String End Class Public Enum InvoiceFileCount FileMissing PassedValidation TooManyFiles End Enum Public Shared Function ValidateFileContent(Vendor As VendorClass) As InvoiceFileValidationClass ValidateFileContent = New InvoiceFileValidationClass ValidateFileContent.FileContent = InvoiceFileContent.PassedValidation Dim MyUnzippedFolder As DirectoryInfo = New DirectoryInfo(Vendor.FTPInPath) Dim LineNumber As Integer = 0 Dim ErrorLine As String = Nothing For Each VendorFile In MyUnzippedFolder.GetFiles() If InStr(VendorFile.Name.ToString, Vendor.InvoiceFileMask) <> 0 Then 'match mask If File.Exists(VendorFile.FullName) Then REM REM Check File Name Extension REM If VendorFile.Extension.ToUpper <> ".CSV" Then ValidateFileContent.ErrorMessage = Vendor.VendorName & ": did not provide a csv file." ValidateFileContent.FileContent = InvoiceFileContent.NotCSVFile End If REM REM Check Column Count Per Row REM Using reader As New StreamReader(VendorFile.FullName) Dim line As String = reader.ReadLine() While line IsNot Nothing Dim temp As New InvoiceTextFileClass Dim fields() As String = line.Split(",".ToCharArray()) If LineNumber > 0 Then 'Do Not Analyze, this is the column header If fields.Length <> Vendor.ExpectedColumnCount Then ValidateFileContent.FileContent = InvoiceFileContent.IntegrityCheckFailed ErrorLine = ErrorLine & LineNumber.ToString & ", " End If End If line = reader.ReadLine() LineNumber += 1 End While End Using End If End If Next If ErrorLine <> Nothing Then ValidateFileContent.ErrorMessage = Vendor.VendorName & ": integrity check failed in the following rows (" & ErrorLine & ")." End If REM REM Check File Row Count REM If LineNumber < 2 Then ValidateFileContent.ErrorMessage = Vendor.VendorName & ": empty file." ValidateFileContent.FileContent = InvoiceFileContent.FileIsEmpty End If End Function
Ben Black.. 7
这是一个重申我们评论的例子
Module Module1 Sub Main() Dim test As New TestingSomethingHere test.Files.Add("test") '' THIS WORKS!!!! BECAUSE FILES HAS BEEN INITIALIZED!!! Dim test2 As New TestingSomethingElseHere test2.Files.Add("test2") '' THIS DOESN'T WORK!! BECAUSE FILES HASN'T BEEN INITIALIZED!!! End Sub Public Class TestingSomethingHere Public Files As New List(Of String) End Class Public Class TestingSomethingElseHere Public Files As List(Of String) End Class End Module
请注意,在我的TestingSomethingHere
课程中,我New
在声明时使用了关键字Files
.这告诉它每当构造该类时,它会自动初始化该成员.(你没有这个)
在我的TestingSomethingElseHere
课堂上,我不使用它(就像你一样),当我尝试在集合中添加一些东西时,我得到了一个NullReferenceException
.这是因为Files
尚未初始化.
有很多方法可以初始化它,但关键是你必须初始化它
要完全拼出来,这是你的班级:
Public Class InvoiceFileValidationClass Public VendorName As String Public FileName As String Public FileCount As InvoiceFileCount Public FileContent As InvoiceFileContent Public ErrorMessage As String Public Files As List(Of ArhiveFilesClass) End Class
这就是你需要的.
Public Class InvoiceFileValidationClass Public VendorName As String Public FileName As String Public FileCount As InvoiceFileCount Public FileContent As InvoiceFileContent Public ErrorMessage As String Public Files As New List(Of ArhiveFilesClass) End Class
变化是
Public Files As List(Of ArhiveFilesClass)
改为
Public Files As New List(Of ArhiveFilesClass)
这是在.NET中初始化需要它的对象的一种方法
这是一个重申我们评论的例子
Module Module1 Sub Main() Dim test As New TestingSomethingHere test.Files.Add("test") '' THIS WORKS!!!! BECAUSE FILES HAS BEEN INITIALIZED!!! Dim test2 As New TestingSomethingElseHere test2.Files.Add("test2") '' THIS DOESN'T WORK!! BECAUSE FILES HASN'T BEEN INITIALIZED!!! End Sub Public Class TestingSomethingHere Public Files As New List(Of String) End Class Public Class TestingSomethingElseHere Public Files As List(Of String) End Class End Module
请注意,在我的TestingSomethingHere
课程中,我New
在声明时使用了关键字Files
.这告诉它每当构造该类时,它会自动初始化该成员.(你没有这个)
在我的TestingSomethingElseHere
课堂上,我不使用它(就像你一样),当我尝试在集合中添加一些东西时,我得到了一个NullReferenceException
.这是因为Files
尚未初始化.
有很多方法可以初始化它,但关键是你必须初始化它
要完全拼出来,这是你的班级:
Public Class InvoiceFileValidationClass Public VendorName As String Public FileName As String Public FileCount As InvoiceFileCount Public FileContent As InvoiceFileContent Public ErrorMessage As String Public Files As List(Of ArhiveFilesClass) End Class
这就是你需要的.
Public Class InvoiceFileValidationClass Public VendorName As String Public FileName As String Public FileCount As InvoiceFileCount Public FileContent As InvoiceFileContent Public ErrorMessage As String Public Files As New List(Of ArhiveFilesClass) End Class
变化是
Public Files As List(Of ArhiveFilesClass)
改为
Public Files As New List(Of ArhiveFilesClass)
这是在.NET中初始化需要它的对象的一种方法