2017-01-14 14 views
-1

私は、音声認識とテキスト読み上げのこのプロジェクトに取り組んでいます。私は3つのスクリプトを持っています.1つはForm.csです。もう1つは、テキストを音声に変換するスクリプト(Voice.cs)と、もう1つの方法はAuxiliary.csです。 Voice.csの変数は通常通りSpeechSynthesizer synth = new SpeechSynthesizer();です。他のスクリプトでこのメソッドを呼び出すと、NullReferenceExceptionが発生するのはなぜですか?

そして、私はこのvoid持っている:私は、私はそれがシンセでNullReferenceExceptionをスローAuxiliary.csからそれを呼び出したとき、それは、良い作品Form.csスクリプトでVoice.Say(string)を呼び出すとき

public void Say(string speech) 
{ 
    synth.SpeakAsync (speech); 
} 

を。

どうしてですか?つまり、フォームスクリプトはまったく同じ方法で呼び出しています。Auxiliary.cs

申し訳ありませんこの質問が既に存在する場合は、サイト全体で検索しましたが、まだ何も出てこなかった。

編集:これはコードです。

//Form1.cs 
    public partial class Form1 : Form 
    { 
     public Auxiliary auxiliary; 
     public Voice voice; 
     public void Form1_Load() 
     { 
      voice = new Voice(); 
      auxiliary = new Auxiliary(); 
      voice.Say("Hi, Patrick"); 
     } 
    } 

    //Auxiliary.cs 
    public class Auxiliary 
    { 
     public Voice voice; 
     public void Start() 
     { 
      voice = new Voice(); 
      voice.Say("Hi"); 
     } 
    } 

    //Voice.cs 
    public class Voice 
    { 
     public SpeechSynthesizer synth; 
     public void Start() 
     { 
      synth = new SpeechSynthesizer(); 
     } 
     public void Say(string speech) 
     { 
      synth.SpeakAsync(speech); 
     } 
    } 
+2

あなたの 'synth'オブジェクトはどこに定義されていますか? – GantTheWanderer

+1

*シンセでnull参照例外をスローしますか? SpeakAsyncを実行しようとしているときにシンセクラスを使用しているシンセクラス内のメソッドの場合と同じですか?デバッガを使って何がヌルであるかを確認して、ヌルでないことを期待しているコードが実行されていない理由を確認できませんか?実際には、あなたが何かを正しく設定していない理由を推測するのに十分な時間を私たちに与えていないのです。 – Chris

+4

[NullReferenceExceptionとは何か、それを修正する方法は?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) ) – Chris

答えて

0

適切な引数を持つコンストラクタをクラスに追加することをお勧めします。あなたのケースでは

Using Constructors (C# Programming Guide)

、方法Voice.Startは()のでsynthオブジェクトのどれもインスタンスが存在し、呼び出されることはありません。

// Voice.cs 
public class Voice 
{ 
    public SpeechSynthesizer synth; 

    public Voice() 
    { 
     Start(); 
    } 

    public void Start() 
    { 
     synth = new SpeechSynthesizer(); 
     synth.SetOutputToDefaultAudioDevice(); 
    } 

    public void Say(string speech) 
    { 
     synth.SpeakAsync(speech); 
    } 
} 
+0

これはform1.csによって呼び出されていますが、質問には書きませんでした。 あなたのヒントをありがとう "コンストラクタの使用"私は今それらを使用し始めます。 私の問題を解決しました。ボイス内のシンセサイザーをインスタンス化してください。そう、それはnullになるでしょう。私はこれがコンピュータにとって高価なのかどうかはわかりませんが、私の問題は解決しました。 –

+0

OMGあなたが言ったことは、Voice.csのコンストラクタを使用しました public Voice() { synth = new SpeechSynthesizer(); synth.SelectVoice( "IVONA 2 Brian"); synth.SetOutputToDefaultAudioDevice(); } ありがとうございました! –

+1

私は、デフォルトのコンストラクタを追加することをお勧めしません。*適切な*引数をつけてコンストラクタを追加することをお勧めします。空の引数リストを持つものが適切であれば、それは良いことですが、それがクラスにとって適切でない場合、悪い習慣になります。 –

関連する問題