C# WinForm:TextBox关键词匹配行写入功能报错求助
问题分析与解决方案
原代码存在的错误
- 空引用异常:数组
text1从索引1开始填充,索引0未赋值;且固定设置rows=5000,当TextBox1的文本行数不足5000时,数组后续元素为null,遍历到null时调用s.Contains(flag)会触发NullReferenceException。 - 逻辑冗余与风险:每次遍历不匹配的行时都会将TextBox2设置为"Not Found",若匹配行出现在遍历序列中间,前面的无效赋值会被覆盖,但空元素会直接中断程序执行,无法完成匹配逻辑。
修正后的代码(简化版)
// 直接按换行符分割TextBox1的文本,无需TextReader string[] lines = TextBox1.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.None); string flag = "healthy"; bool found = false; foreach (string line in lines) { // 先判断行不为空,再检查关键词 if (!string.IsNullOrEmpty(line) && line.Contains(flag)) { TextBox2.Text = line; found = true; break; // 找到第一个匹配项后停止遍历 } } // 仅在遍历结束后未找到匹配项时设置提示 if (!found) { TextBox2.Text = "Not Found"; }
保留TextReader的修正版本
如果坚持使用TextReader读取,可改为逐行读取直到末尾,避免固定行数限制:
using (TextReader read = new StringReader(TextBox1.Text)) { string flag = "healthy"; string line; bool found = false; // 逐行读取,直到ReadLine返回null(文本末尾) while ((line = read.ReadLine()) != null) { if (line.Contains(flag)) { TextBox2.Text = line; found = true; break; } } if (!found) { TextBox2.Text = "Not Found"; } }
代码说明
- 简化行读取:用
Split直接分割文本,避免固定数组的冗余操作,同时规避空元素问题。 - 空值防护:遍历前判断行是否为空,防止空引用异常。
- 优化匹配逻辑:用
found标记记录匹配状态,仅在遍历结束后统一处理未找到的情况,避免中间无效赋值。
内容的提问来源于stack exchange,提问作者user20465780
相关产品推荐
相关产品推荐

