我在C#2.0 WinForms应用程序中遇到了一个非常奇怪的问题,我甚至不确定它是否值得问这个问题,因为问题发生在一个奇怪的设置中,我不认为你可以在没有我的情况下重现它消息来源,但我完全没有想法。
我的表单左侧是TreeView
,右侧是ListView
。 TreeView
显示特定文件夹中的所有可用文件和子文件夹(其中包含我的应用程序所需的文档)。如果选择了“文件夹”,则ListView
会显示所选文件夹中的所有文件和子文件夹。在启动时,我将TreeView表单填充到文件夹中,之后我按代码选择第一个TreeNode
(在我的例子中,它是一个文件夹)。之后,TreeView的内容如下所示:
-folder
-file1
-file2
选择文件夹会触发AfterSelecedEvent
的{{1}}。因为选择了一个文件夹,所以我使用以下方法填充TreeView
:
ListView
正如您所看到的,没有子文件夹,因此在此设置中永远不会触及行private void fillOverview(FAFolder folder)
{
lv_overview.Items.Clear();
ListViewItem item;
foreach (FAFile file in folder.sortedContent)
{
if (file is FAFolder)
{
item = new ListViewItem(file.Name, "Folder"); //exception got thrown here
}
else
{
item = new ListViewItem(file.Name, file.Name);
}
item.Tag = file;
lv_overview.Items.Add(item);
}
}
,但偶尔会抛出item = new ListViewItem(file.Name, "Folder");
。如果我使用try / catch包装此行,则会在catch块中抛出异常。我尝试检查所有内容,如果它是NullReferenceException
,但是没有空引用。或者,如果我在此行之前添加null
,则仍会抛出异常并且不会弹出MessageBox
。这让我得出结论:execption stacktrace是错误的和/或这个异常来自其他MessageBox
或类似的东西。
我是一个非常乐观的人,我知道SO社区有多聪明,但我不认为任何人都可以指出问题是什么。所以我真正想要的是提示和建议如何找到并调试这种奇怪行为的原因。
编辑:
Thread
答案 0 :(得分:0)
您是否尝试过对folder.sortedContent
进行空检查?
通常ReSharper会提示我类似的东西应该有空检查。
如果您想确定,请在foreach循环上方的代码中添加以下行:
if (folder.sortedContent == null) throw new Exception("It was null, dangit!");
答案 1 :(得分:0)
在你提到的那一行:
item = new ListViewItem(file.Name, "Folder")
唯一可能导致NullReferenceException的是if file
为null(除非从ListViewItem构造函数本身抛出异常)。
您没有提供folder.sortedContent
的代码,所以我无法分辨 - 但在某些情况下,此集合中的某个元素是否可能为空?
如果ListViewItem构造函数抛出异常,那么您将需要使用Reflector来查看代码,或者下载参考源。
答案 2 :(得分:0)
我的一位同事刚刚找到答案(可能)。我使用一个线程从硬盘驱动器将ImageList
加载到ListView
,这个线程有时会冻结,如果我分配一个ImageKey,它就会失败。这无法解释为什么异常无法捕获或者为什么它被抛到这个(无法到达的)线上。但我强烈相信这是问题的原因。
答案 3 :(得分:0)
该线路无法到达。因为FAFolder派生自FAFile,'file is FAFolder'可能会返回true。
但是,这意味着该文件不为null,除非它被另一个线程更改。
编辑:文件无法被其他线程更改,因为它是本地引用。你能为异常提供堆栈跟踪吗?这个让我现在很感兴趣。
答案 4 :(得分:0)
如果结果不真实,那么这个答案会被相应编辑吗?
希望这有帮助, 最好的祝福, 汤姆。
答案 5 :(得分:0)
通常,有两种方法可以调试这种类型的东西。第一种方式是所谓的“科学”调试:
第二种方法是逐个删除实际代码,直到不再触发异常为止。那么你有进一步调查的重要线索。
这让我得出结论:execption stacktrace是错误的......
通常假设problem is in your own code更容易开始。