2014-02-11 80 views
0

所以我在我的Google Speech API中遇到了一個錯誤。正如標題所示,錯誤是「並非所有路徑都返回一個值」。 下面是代碼(2個peices)(同樣的錯誤)並非所有的路徑都返回值

public static SpeechInputResult ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1) 
     { 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1" + "&client=" + client + "&lang=" + language + "&maxresults=" + maxresults + "&pfilter=0"); 
      FileStream fStream = new FileStream(FlacFileName, FileMode.Open, FileAccess.Read); 
      request.Proxy = null; 
      request.Timeout = 60000; 
      request.KeepAlive = true; 
      request.Method = "POST"; 
      request.ContentType = "audio/x-flac; rate=8000"; 
      //bitrate must = .flac file 
      request.UserAgent = client; 
      FileInfo fInfo = new FileInfo(FlacFileName); 
      long numbytes = fInfo.Length; 
      byte[] data = null; 
      using (FileStream fstream = new FileStream(FlacFileName, FileMode.Open, FileAccess.Read)) 
       data = new byte[fstream.Length]; 
      fStream.Read(data, 0, Convert.ToInt32(fStream.Length)); 
      fStream.Close(); 
      using (Stream wrStream = request.GetRequestStream()) 
      { 
       wrStream.Write(data, 0, data.Length); 
      } 
      try 
      { 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       dynamic resp = response.GetResponseStream(); 
       if (resp != null) 
       { 
        StreamReader sr = new StreamReader(resp); 
        MessageBox.Show(sr.ReadToEnd()); 
        resp.Close(); 
        resp.Dispose(); 
       } 
      } 
      catch (System.Exception ee) 
      { 
       MessageBox.Show(ee.Message); 
      } 
     } 
    } 
} 

和第二張的位置:

  public class Hypothesis 
     { 
      public string utterance; 
      public double confidence = -1.0d;//-1 = No Value 
      public override string ToString() 
      { 
       return "'" +utterance + "'" + ((confidence == -1) ? "" : "@" + confidence); 
      } 
      public List<Hypothesis> hypotheses = new List<Hypothesis>(); 

      public Hypothesis getBestHypothesis() 
      { 
       if (hypotheses.Count() <=0) 
        return null; 
       Hypothesis H = hypotheses[0]; 
       foreach (Hypothesis h in hypotheses) 
       { 
        if (h.confidence>=H.confidence) 
        { 
         H = h; 
        } 
        return H; 
       } 
      } 

兩個代碼具有相同的錯誤,並且似乎只發生,如果我一定變量名與其他變量(FlacFileName,確切地說)是相同的名稱。如果你們可以告訴我爲什麼發生這種事真是太棒了,謝謝!

+0

好吧,這意味着你的代碼中沒有任何執行路徑返回一個值。 – zerkms

+0

第一個函數中沒有'return'語句。 – Barmar

+0

因此,基本上在第一個if語句的末尾添加return語句? –

回答

2

你的方法簽名

public static SpeechInputResult ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1) 

規定您將回到一個SpeechInputResult,但你有沒有return聲明。

您應該將簽名更改爲void或實際返回一個值。

在第二個實例中,您需要for循環後的return語句。

1

第一塊代碼沒有任何返回語句。在第二個代碼塊中,在for循環之外放置一個僞返回語句。

1

在你的第一個方法中,你在簽名中聲明,它將返回SpeechInputResult類型的實例,而你沒有從body中返回它。

而在第二種方法中,您從foreach循環內返回,但如果​​列表沒有任何元素,該怎麼辦?您還應該返回foreach循環之外的默認值,或者如果它不是您的預期行爲,應該引發異常。

1

ProcessFlacFile上述代碼中的方法在所有情況下都應該返回一個類型爲SpeechInputResult的對象。

你可以試試,趕上

​​

回報均trycatch聲明

try 
{ 
    .... 
    return SpeechInputResultObj; 
} 

catch 
{ 
    .... 
    return SpeechInputResultObj; 
} 
+0

我只好把返回null;在捕捉和結束它的工作! –

2

就像提到大家SpeechInputResult物體後返回的對象,添加一個return聲明到第一種方法的結尾。只需一個return null;或任何適合您的情況。實際上,根本沒有其他的return陳述,所以它不是像第二個那樣「不是所有路徑都返回值」的情況......您可能只想將簽名從SpeechInputResult更改爲void


在第二種方法中,它似乎你已經覆蓋你的基地,這是因爲:

  • 你返回null如果​​是空的,
  • 您傳回​​與最大的「信心」,如果它不是空的

但是編譯器不夠聰明,看不到。嘗試將return null;移動到最後。如果列表中沒有元素,並且foreach循環未運行,則只有這樣才能實現此功能。

public Hypothesis getBestHypothesis() 
{ 
    if (hypotheses.Any()) 
    { 
     Hypothesis H = hypotheses[0]; 

     foreach (Hypothesis h in hypotheses) 
     { 
      if (h.confidence >= H.confidence) 
      { 
       H = h; 
      } 
      return H; 
     } 
    } 
    return null; 
} 

同樣,整個第二個方法可以減少(與LINQ的幫助下):

return hypotheses.OrderByDescending(x => x.confidence).FirstOrDefault(); 
+0

這表示感謝!現在只是第二個。 –

+0

第二個?你指的是哪一個? –

2

我發現在你的代碼,你必須返回SpeechInputResult但沒有哪裏你正在使用return語句。 最好是你在你的代碼中使用return SpeechInputResult

其他明智的把你的功能如下,如果你的不願意任何返回。

public static void ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1) 

,如果你想成爲它沒有在這種情況下錯誤,您可以用void而不是類SpeechInputResult作爲在上面的代碼。

在第二段代碼中你只實例化了代碼。即聲明並直接使用它 你必須有東西分配給你創建的對象,以便你可以在foreach中執行操作。

在這種情況下​​沒有任何東西在裏面。

此外,你已經寫了foreach循環內的返回語句,因爲焦點永遠不會進入foreach循環。

首先你給​​指定一些東西,以便它具有價值,然後執行操作。

相關問題