C# System.NullReferenceException–;对象引用未设置为对象的实例

C# System.NullReferenceException–;对象引用未设置为对象的实例,c#,wpf,C#,Wpf,当我尝试运行程序时,它会抛出以下错误:对象引用未设置为对象的实例。代码有问题吗?救命啊 private void InitSpeechRecognition() { _audioSource = new KinectAudioSource { FeatureMode = true, AutomaticGainControl = false,

当我尝试运行程序时,它会抛出以下错误:对象引用未设置为对象的实例。代码有问题吗?救命啊

private void InitSpeechRecognition()
        {

            _audioSource = new KinectAudioSource
            {
                FeatureMode = true,
                AutomaticGainControl = false,
                SystemMode = SystemMode.OptibeamArrayOnly
            };
            var ri =
              SpeechRecognitionEngine.InstalledRecognizers().
                Where(r => r.Id == RecognizerId).FirstOrDefault();
            _engine = new SpeechRecognitionEngine(ri.Id);
            var gb = new GrammarBuilder { Culture = new CultureInfo("en-US") };


            gb.Append(CommandMessage.Choices);


            var g = new Grammar(gb);
            _engine.LoadGrammar(g);
            _engine.SpeechRecognized += SreSpeechRecognized;

            _audioStream = _audioSource.Start();
            _engine.SetInputToAudioStream(_audioStream,
                                          new SpeechAudioFormatInfo(
                                          EncodingFormat.Pcm, 16000, 16, 1,
                                          32000, 2, null));
            _engine.RecognizeAsync(RecognizeMode.Multiple);
        }

        private void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {

            if (CommandMessage.Commands.ContainsKey(e.Result.Text))
            {
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
                  new Action(() =>
                    Messenger.Default.Send(
                       new CommandMessage { Command = CommandMessage.Commands[e.Result.Text] })));
            }
        }
这里,FirstOrDefault()返回序列中的第一个对象,如果没有找到匹配项,则返回null。 然后在下一行中,您将尝试访问对象的Id属性,该属性可能为null

在赋值后执行null检查,仅当ri不为null时才使用。 例如

或者使用First()方法代替FirstOrDefault(),并用try-catch块包围代码,以处理序列为空时的情况

但是为什么会出现null,可能是真正的问题所在。ri为null,因为没有安装id为RecognizerId的识别器。我看不到您设置它的代码,所以请查看该部分


另外,看看本页上的示例,它可能包含您所需要的内容:

您可以在例外点提供stacktrace吗哪一行?其中许多都会导致NullReferenceException!ri可以为null(因为FirstOrDefault),例如。\u engine=new SpeechRecognitionEngine(ri.Id);(对不起,这是一行!)@Jess那么问题是ri是空的。您没有安装任何识别器,或者没有任何具有给定id的识别器。让用户选择(通过配置,您将向她显示完整列表,然后保存她选择的识别器的id)。作为替代方案(或者如果用户没有选择任何内容,或者如果您找不到她想要使用的内容),选择列表中的第一个。如果列表为空,只需退出并出错。提示:如果列表可以为空且不处理null大小写,则不要使用FirstOrDefault()。通常,调试更具体的异常比调试NullReferenceException更容易。感谢您提供的信息。这真的节省了我的时间
var ri = SpeechRecognitionEngine.InstalledRecognizers().
            Where(r => r.Id == RecognizerId).FirstOrDefault();
  if (ri != null)
  {
    ...
  }