C# 包含子字符串的Null异常错误

C# 包含子字符串的Null异常错误,c#,substring,nullreferenceexception,C#,Substring,Nullreferenceexception,我收到一个空引用异常错误,它与substring函数或LastIndex函数有关。我很困惑为什么 String[] m_SessionNames; String[] filenames; //Filenames already initialized in code int Index = 0; foreach (String name in filenames) {

我收到一个空引用异常错误,它与substring函数或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++;                                                                                                                                                        
                }

似乎是
文件名[索引]
为空。因此,如果调用
文件名[Index]
上的任何方法,可能会产生NullPointerException。iI如果文件名已在代码中初始化,则原因可能是
m_SessionNames[Index]
并且可以计算为null。这是因为我们看不到m_SessionNames未在代码中的任何位置初始化

似乎
文件名[索引]
为空。因此,如果调用
文件名[Index]
上的任何方法,可能会产生NullPointerException。iI如果文件名已在代码中初始化,则原因可能是
m_SessionNames[Index]
并且可以计算为null。这是因为我们看不到m_SessionNames在代码中的任何地方都没有初始化。看起来您正在尝试从路径中获取文件名

          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++;                                                                                                                                                        
                }
幸运的是,已经有了一种方法:

          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++;                                                                                                                                                        
                }

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

          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++;                                                                                                                                                        
                }
幸运的是,已经有了一种方法:

          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++;                                                                                                                                                        
                }

您是说m_会话名和文件名都已初始化

          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++;                                                                                                                                                        
                }
如果是这样的话,你不应该

          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++;                                                                                                                                                        
                }
字符串[]m_SessionNames; 字符串[]文件名

          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++;                                                                                                                                                        
                }
在你的代码之上

          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++;                                                                                                                                                        
                }
它们在哪里初始化?即使它们可能在其他地方被初始化,您在这里声明了2个未初始化的新数组

          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++;                                                                                                                                                        
                }

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

您说的是m_会话名和文件名都已初始化

          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++;                                                                                                                                                        
                }
如果是这样的话,你不应该

          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++;                                                                                                                                                        
                }
字符串[]m_SessionNames; 字符串[]文件名

          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++;                                                                                                                                                        
                }
在你的代码之上

          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++;                                                                                                                                                        
                }
它们在哪里初始化?即使它们可能在其他地方被初始化,您在这里声明了2个未初始化的新数组

          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++;                                                                                                                                                        
                }


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

无论哪种方式,它归结为
文件名[Index]
为空。如果允许,请检查是否为null,如果不允许,请修复分配它的代码。如果您提供一个简短但完整的程序来演示此问题,则m_SessionName未初始化Edit会有所帮助。很抱歉,m_SessionName已初始化。我只是忘了把它添加到这个片段中。我检查了文件名[索引]是否为空。它不是将代码分开,然后找出哪一行实际抛出异常。不管怎样,它归结为
filenames[Index]
为空。如果允许,请检查是否为null,如果不允许,请修复分配它的代码。如果您提供一个简短但完整的程序来演示此问题,则m_SessionName未初始化Edit会有所帮助。很抱歉,m_SessionName已初始化。我只是忘了把它添加到这个片段中。我检查了文件名[索引]是否为空。它不是拆开你的代码,找出哪一行实际抛出异常。我检查了它是否为空。它不是..if(filenames[Index]!=null)MessageBox.Show(“hello”)//显示helloI检查是否为空。它不是..if(filenames[Index]!=null)MessageBox.Show(“hello”)//这就是我正在完成的事情。我将尝试此方法,并让您知道它是如何工作的。不幸的是,我仍然收到错误,但我可以打印出文件名,并且我没有收到文件名为null的消息。Linq方法不会产生任何null异常。但如果可能的话,我希望它是一个字符串数组?您需要确保
m_SessionNames
数组已初始化,并且它有足够的容量容纳所有文件名;这可能就是问题所在,对吗?我对csharp内存分配不太乐观。这就是我正在完成的。我将尝试此方法,并让您知道它是如何工作的。不幸的是,我仍然收到错误,但我可以打印出文件名,并且我没有收到文件名为null的消息。Linq方法不会产生任何null异常。但如果可能的话,我希望它是一个字符串数组?您需要确保
m_SessionNames
数组已初始化,并且它有足够的容量容纳所有文件名;这可能就是问题所在,对吗?我对csharp内存分配不太肯定。如果它们实际上没有初始化,代码就不会编译。他将无法获取空引用,因为由于“使用未分配的本地…”而无法构建它。他们肯定需要更新他们的代码,使之符合实际编译的要求。我已经将他们声明为类的公共成员。我必须通过构造函数来填充它们吗?是的,你需要初始化它们。你在哪里分配代码,用什么来显示代码?如果您还没有填充它们是的,您需要在到达此代码之前的某个地方进行填充(我的意思是初始化它们并填充)。如果它们是类的公共成员(字段),则您需要在创建类时“每次”对它们进行初始化。如果它们实际上没有初始化,则代码将无法编译。他将无法获取空引用,因为由于“使用未分配的本地…”而无法构建它。他们肯定需要更新他们的代码,使之符合实际编译的要求。我已经将他们声明为类的公共成员。我必须通过构造函数来填充它们吗?是的,你需要初始化它们。你在哪里分配代码,用什么来显示代码?如果您还没有填充它们是的,您需要在到达此代码之前的某个地方进行填充(我的意思是初始化它们并填充)
          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++;                                                                                                                                                        
                }