0

我收到一个空引用异常错误,它与子字符串函数或 LastIndex 函数有关。我很困惑为什么

          String[] m_SessionNames;
          String[] filenames; //Filenames already initialized in code
          int Index = 0;
                foreach (String name in filenames)
                {
                    MessageBox.Show(filenames[index]) //Works, Displays a string that includes a '\'
                    m_SessionNames[Index] = filenames[Index].Substring((filenames[Index].LastIndexOf('\\') > 0) ? filenames[Index].LastIndexOf('\\') + 1 : 0);
                    Index++;                                                                                                                                                        
                }
4

3 回答 3

2

你说 m_SessionNames 和文件名都已经初始化了。

如果是这样的话,你不应该有

字符串[] m_SessionNames; 字符串[] 文件名;

在您的代码之上。

它们在哪里初始化?即使它们可能在其他地方被初始化,您也在这里声明了 2 个未初始化的新数组。

如果您在函数中使用此代码,则在类级别声明 m_SessionNames 和文件名,然后填充它们。然后在这个函数中你不需要再次声明它们。

于 2013-07-15T16:46:04.043 回答
1

看起来您正试图从路径中获取文件名。

幸运的是已经有一个方法:Path.GetFileName

var m_SessionNames = new List<string>();

for (int i = 0; i < filenames.Length; i++)
{
    var filename = filenames[i];

    if (string.IsNullOrWhiteSpace(filename))
    {
        MessageBox.Show("filename is null");
        continue;
    }

    MessageBox.Show(filename);

    m_SessionNames.Add(Path.GetFileName(filename));
}

return m_SessionNames.ToArray();

这是使用 Linq 的更简洁的方法。

// Get all valid filenames
var sessionNames = filenames.Select(Path.GetFileName)
                            .Where(f => !string.IsNullOrWhiteSpace(f));

m_SessionNames = sessionNames.ToArray();
于 2013-07-15T16:36:12.837 回答
0

似乎filenames[Index]是空的。因此,如果您调用任何方法,filenames[Index]它可能会产生 NullPointerException。i如果文件名已经在代码中初始化,那么原因可能是m_SessionNames[Index]并且它可以被评估为空。这是因为我们看不到 m_SessionNames 在代码中的任何地方都没有初始化

于 2013-07-15T16:29:54.060 回答