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

为何try块内的NullReferenceException仍会终止程序执行?

问题分析与解决方案

核心问题原因

  1. VS调试设置触发异常中断:默认情况下Visual Studio会在NullReferenceException抛出时直接中断程序,哪怕代码里写了try/catch块,调试器也会先触发中断,让你误以为异常没被捕获。
  2. NPOI行/单元格空值逻辑:Excel中不存在的行,sheet.GetRow()会返回null,此时链式调用.GetCell(8)就会触发空引用异常;即使行存在,空单元格默认返回null,调用.ToString()同样会抛异常。

解决步骤

1. 调整Visual Studio调试设置

打开VS顶部菜单的调试 -> Windows -> 异常设置,在弹出窗口里找到Common Language Runtime Exceptions -> System.NullReferenceException,取消勾选「抛出时中断」选项。这样异常会被你的catch块正常捕获,不会直接终止程序。

2. 优化代码逻辑,避免依赖try/catch处理空值

不要用链式调用直接获取单元格值,分步判断行和单元格是否存在,同时利用NPOI的MissingCellPolicy规范空单元格处理:

while (!String.IsNullOrEmpty(columnI_value))
{
    typeOfShareLineCounter++;
    int targetRowIndex = 3 + typeOfShareLineCounter + typeOfShareStartIndexNewFile;
    
    // 先获取行,判断是否存在
    var row = sheet.GetRow(targetRowIndex);
    if (row == null)
    {
        columnI_value = string.Empty;
        continue;
    }
    
    // 指定空单元格处理策略:返回空白单元格而非null,避免后续ToString()抛异常
    var cell = row.GetCell(8, MissingCellPolicy.ReturnNullAsBlank);
    columnI_value = cell.ToString();
}

补充说明

  • MissingCellPolicy.ReturnNullAsBlank:当单元格不存在或为空时,返回BlankCell对象,调用ToString()会返回空字符串,彻底规避空引用问题。
  • 分步判断行和单元格的存在性,比依赖try/catch更高效,也更符合代码可读性要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:50:34