You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

StreamReader读取文件时触发“Value cannot be Null. Parameter name: input”错误的原因及解决咨询

问题分析与解决方案

嘿,我来帮你搞定这个报错!首先咱们先搞清楚为啥会出现Value cannot be Null. Parameter name: input这个错误:

错误核心原因

你的代码有两个关键问题:

  1. 循环逻辑导致空值直接使用:你先读取了一行line = sr.ReadLine(),进入While (line <> Nothing)判断后,立刻又读取了下一行line = sr.ReadLine()——这不仅会跳过文件的第一行,更关键的是,当文件读到末尾时,sr.ReadLine()会返回Nothing,这时你直接拿着这个空值去调用Regex.IsMatch(line, "\b40\S*"),而Regex.IsMatch的第一个参数不允许为null,所以触发了空参数异常。
  2. 固定文件名的逻辑bug:你明明在遍历所有找到的850_*.txt文件,但StreamReader里硬编码了一个固定文件名,这意味着循环多少次,都只会处理那一个特定文件,完全没用到遍历的文件路径,这肯定不是你想要的效果。

修复步骤

咱们一步步调整:

  1. 重构循环顺序:先处理当前读取到的行,再读取下一行,确保永远不会用空值去调用正则匹配。
  2. 替换固定文件名:用循环中的文件路径代替硬编码的文件名,真正处理所有找到的目标文件。
  3. 优化重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 02:48:12