并非所有路径都返回值

时间:2014-02-11 04:40:46

标签: c# syntax-error

所以我使用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)。如果你们能告诉我为什么会这样,那将是非常棒的谢谢!

6 个答案:

答案 0 :(得分: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 :(得分:2)

与所有提到的人一样,在第一个方法的末尾添加一个return语句。只需return null;或适合您的情况。实际上,在该方法中根本没有其他return语句,因此它不是“并非所有路径返回值”的情况,例如第二个......您可能只想更改{{1}中的签名} SpeechInputResult


在第二种方法中,似乎就像你已经覆盖了你的基础,因为:

  • 如果void为空且
  • ,您将返回null
  • 如果hypotheses不是空的话,你将返回hypotheses最大的“信心”

但是编译器不够聪明才能看到它。尝试将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();

答案 2 :(得分: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,则可以使用void而不是类SpeechInputResult

在第二段代码中,您只实例化了代码。即声明并直接使用它 您必须为您创建的对象分配一些内容,以便您可以在foreach中执行操作。

在这种情况下hypotheses里面没有任何东西。

你也在foreach循环中编写了return语句,因为焦点永远不会进入foreach循环。

首先,您为hypotheses分配一些内容,使其具有值,然后执行操作。

答案 3 :(得分:1)

第一个代码块没有任何return语句。在第二个代码块中,在for循环之外放置一个伪返回语句。

答案 4 :(得分:1)

在你的第一个方法中,你在签名中声明,它将返回类型SpeechInputResult的实例,而你不是从正文中返回它。

而且,在第二种方法中,你是从foreach循环内部返回的,但是如果你的hypotheses列表没有任何元素呢?您还应该从foreach循环之外返回默认值,否则如果不是您预期的行为,则应该抛出异常。

答案 5 :(得分:1)

上述代码中的

ProcessFlacFile方法应该在所有情况下返回类型SpeechInputResult对象。

你可以在try和catch后返回对象

try
{
}
catch
{
}

return SpeechInputResultObj

SpeechInputResulttry语句

中返回catch个对象
try
{
    ....
    return SpeechInputResultObj;
}

catch
{
    ....
    return SpeechInputResultObj;
}