我在我的 C# 2.0 WinForms 应用程序中遇到了一个非常奇怪的问题,我什至不确定是否值得问这个问题,因为这个问题发生在一个奇怪的设置中,我认为没有我的帮助你无法重现它来源,但我完全没有想法。
我有一个表单,左边有一个 TreeView
,右边有一个 ListView
。 TreeView
显示特定文件夹中的所有可用文件和子文件夹(其中包含我的应用程序所需的文档)。如果选择了文件夹,ListView
会显示所选文件夹中的所有文件和子文件夹。在启动时,我从文件夹中填充 TreeView,然后我通过代码选择第一个 TreeNode
(在我的例子中它是一个文件夹)。之后 TreeView 的内容如下所示:
-folder
-file1
-file2
选择文件夹会触发 TreeView
的 AfterSelecedEvent
。因为选择了一个文件夹,所以我使用以下方法填充 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");
行,但时不时NullReferenceException
被抛出。如果我用 try/catch 包装这一行,异常就会在 catch block 内抛出。我尝试检查所有内容是否为 null
,但没有 nullreferences。或者,如果我在此行之前添加一个 MessageBox
,异常仍然会被抛出,并且不会弹出任何 MessageBox
。这使我得出结论,execption 堆栈跟踪是错误的和/或此异常来自其他 Thread
或类似的东西。
我是一个非常乐观的人,我知道 SO 社区有多么聪明,但我认为没有人能指出问题所在。所以我真正要寻找的是提示和建议,我可以如何找到和调试这种奇怪行为的原因。
编辑:
internal abstract class FAFile
{
internal string Name;
internal readonly FAFolder Parent;
internal FAFile(FAFolder parent)
{
this.Parent = parent;
}
}
internal sealed class FAFolder : FAFile
{
internal readonly IDictionary<string, FAFile> Content = new Dictionary<string, FAFile>();
internal FAFolder(FAFolder parent, string name) : base(parent)
{
this.Name = name;
}
}
internal sealed class FADocument : FAFile
{
public readonly string Path;
public FADocument(FAFolder parent, string path): base(parent)
{
this.Path = path;
this.Name = System.IO.Path.GetFileNameWithoutExtension(path);
}
}
最佳答案
您是否尝试过对 folder.sortedContent
进行空检查?
通常 ReSharper 会提示我类似的东西应该进行空检查。
如果您想确定,请将以下行添加到您的代码中,在 foreach 循环之上:
if (folder.sortedContent == null) throw new Exception("It was null, dangit!");
关于c# - 来自无法访问的代码的无法捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2288704/