StreamReader读取文件时触发“Value cannot be Null. Parameter name: input”错误的原因及解决咨询
问题分析与解决方案
嘿,我来帮你搞定这个报错!首先咱们先搞清楚为啥会出现Value cannot be Null. Parameter name: input这个错误:
错误核心原因
你的代码有两个关键问题:
- 循环逻辑导致空值直接使用:你先读取了一行
line = sr.ReadLine(),进入While (line <> Nothing)判断后,立刻又读取了下一行line = sr.ReadLine()——这不仅会跳过文件的第一行,更关键的是,当文件读到末尾时,sr.ReadLine()会返回Nothing,这时你直接拿着这个空值去调用Regex.IsMatch(line, "\b40\S*"),而Regex.IsMatch的第一个参数不允许为null,所以触发了空参数异常。 - 固定文件名的逻辑bug:你明明在遍历所有找到的
850_*.txt文件,但StreamReader里硬编码了一个固定文件名,这意味着循环多少次,都只会处理那一个特定文件,完全没用到遍历的文件路径,这肯定不是你想要的效果。
修复步骤
咱们一步步调整:
- 重构循环顺序:先处理当前读取到的行,再读取下一行,确保永远不会用空值去调用正则匹配。
- 替换固定文件名:用循环中的文件路径代替硬编码的文件名,真正处理所有找到的目标文件。
- 优化重复IO操作:把
Directory.GetFiles的结果提前存到变量里,避免多次重复读取目录,提升代码效率。
修复后的完整代码
Dim Directory1 As String = "C:\Perl_Scripts" Dim Ext2Find As String = "850_*.txt" ' 先获取所有匹配的文件,存到变量里避免重复调用 Dim targetFiles() As String = System.IO.Directory.GetFiles(Directory1, Ext2Find, IO.SearchOption.AllDirectories) If targetFiles.Length > 0 Then ' 用For Each遍历更简洁易读 For Each filePath As String In targetFiles ' MsgBox(Ext2Find & " was found! " & filePath) Using sr As StreamReader = New StreamReader(filePath) Dim line As String = sr.ReadLine() ' 先判断line不为空,再处理内容 While line IsNot Nothing ' 先处理当前行的正则匹配 If Regex.IsMatch(line, "\b40\S*") Then MsgBox(line) Else MsgBox("THERES NO MATCH") End If ' 再读取下一行准备下一次循环 line = sr.ReadLine() End While End Using Next Else MsgBox(Ext2Find & " was not found!") End If
额外说明
- 我把原来的
For i循环改成了For Each,代码更简洁,也避免了索引操作的潜在问题。 - 现在的循环逻辑是:读取一行→判断是否为空→处理该行→再读取下一行,完美规避了空值传入正则方法的问题,也不会跳过文件的第一行。
内容的提问来源于stack exchange,提问作者Paul Yang
相关产品推荐
相关产品推荐

