.NET Core 3.1下iText7代码编译通过运行抛NullReferenceException求助
问题分析与修复方案
你遇到的NullReferenceException主要由索引越界和变量作用域冲突导致,以下是具体问题和修复代码:
核心问题
- 固定数量的Table与查询行数不匹配:你初始化了仅包含10个
Table的列表,但如果数据库查询结果的行数超过10行,当i递增到10时,tables[i]会访问列表范围外的元素,间接触发空引用异常。 - 变量作用域冲突:初始化
tables的for循环未声明int i,若编译通过,会复用后续声明的i变量,导致tables的初始化逻辑异常,出现null元素。 - 隐性语法错误:代码中大写的
For、未定义的newline均属于语法问题,虽未直接引发当前异常,但会导致其他运行错误。
修复后的代码
class Program { static PdfDocument pdfTable; static Document document; static string destination; static void Main() { destination = Path.Combine(@"C:\Users\Administrator\Documents", "SRC_Selection.pdf"); pdfTable = new PdfDocument(new PdfWriter(destination)); document = new Document(pdfTable); // 假设此处已正确初始化MySqlCommand cmd using (MySqlDataReader reader = cmd.ExecuteReader()) { List<Table> tables = new List<Table>(); int i = 0; // 按需创建Table,适配任意查询行数 while (reader.Read()) { Table table = new Table(1); tables.Add(table); for (int j = 0; j < reader.FieldCount; j++) { // 处理数据库字段为null的情况 string cellContent = reader.IsDBNull(j) ? string.Empty : reader.GetString(j); Cell cell = new Cell() .SetFontSize(10) .SetTextAlignment(TextAlignment.LEFT) .Add(new Paragraph(cellContent)); table.AddCell(cell); } document.Add(table); // 添加换行分隔 document.Add(new Paragraph("\n")); i++; } } // 必须关闭文档,确保PDF正确生成 document.Close(); pdfTable.Close(); } }
关键修复点
- 动态创建Table:去掉固定10个Table的初始化逻辑,改为在每次读取数据库行时创建新的Table,彻底避免索引越界问题。
- 处理null字段:增加
reader.IsDBNull(j)判断,防止Paragraph构造函数传入null值。 - 修正语法错误:将大写
For改为小写for,替换未定义的newline为new Paragraph("\n")。 - 关闭文档资源:添加
document.Close()和pdfTable.Close(),确保PDF文件正确保存,避免损坏。
内容的提问来源于stack exchange,提问作者Mat52
相关产品推荐
相关产品推荐

