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

VB.NET字符串列表拼接触发NullReferenceException的解决方法

报错根源

你最初的代码抛出空引用异常,核心原因是列表初始化阶段就会立刻执行a.ToString()、b.ToString()、c.ToString()的调用,只要其中任意变量为Nothing(null),就会在访问ToString()方法时直接报错,后续的Where过滤逻辑根本没有执行机会——因为LINQ的Where是延迟执行的,要等遍历序列的时候才会跑,而你构造列表时的异常已经提前触发了。

你自己写的逐变量判断再Add的写法逻辑上是正确的,可以正常运行,但不算最优:如果后续要新增拼接字段,你需要重复写多行If xxx IsNot Nothing的判断,冗余度高,容易漏判。


更简洁优雅的实现

如果你的项目使用VB 14(VS 2015及以上版本),可以借助Nothing条件运算符?.把空判断、转字符串、过滤逻辑统一处理,不需要手动逐变量判断:

' 直接把原始对象放入序列,不要提前调用ToString
Dim rawItems = {a, b, c}
Dim result As String = String.Join(" | ", 
    rawItems.
        Select(Function(item) item?.ToString()). ' 变量为Nothing时直接返回Nothing,不调用ToString,不会抛异常
        Where(Function(s) Not String.IsNullOrWhiteSpace(s)) ' 过滤Nothing、空串、全空白字符串
)

这个写法的优势是:新增待拼接字段时,只需要把变量名加到rawItems的数组初始化块里即可,不需要额外加判断逻辑,可维护性更强。

如果是不支持?.运算符的老版本VB,可以抽一个通用的安全转字符串方法复用:

' 全局可复用的辅助方法
Private Function SafeToString(item As Object) As String
    If item Is Nothing Then Return String.Empty
    Return item.ToString()
End Function

' 业务代码里的拼接逻辑
Dim result As String = String.Join(" | ", 
    {a, b, c}.
        Select(AddressOf SafeToString).
        Where(Function(s) Not String.IsNullOrWhiteSpace(s))
)

补充说明:String.Join本身会自动忽略序列中的Nothing元素,但它不会自动过滤空串、全空白字符串,也不会处理对象转字符串阶段的空引用问题,所以转义+过滤的步骤不能省。


内容的提问来源于stack exchange,提问作者andyopayne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:21:36