并非所有代码路径都返回值

时间:2014-10-06 23:08:39

标签: c#

我编写了一个函数来通过搜索文本找到该行,在找到该特定行之后,我想读取下一行并返回该文本。功能如下:

public static string NextString(string textfind)
{
    List<string> found = new List<string>();
    string linejd;

    using (StreamReader efile = new StreamReader(FILENAME))
    {
        int counter = 0;
        while ((linejd = efile.ReadLine()) != null)
        {
            counter++;
            if (linejd.Contains(textfind))
            {
                found.Add(linejd);
                string nextstring = efile.ReadLine();
                return nextstring;
            }
        }
    }
}

文件名已定义为:

const string FILENAME = @"E:\model\Yen and Lee\AQRun01\eratc.inp";

然而,我一直在收到错误:

  

AQ.Program.NextString(string)':并非所有代码路径都返回值

5 个答案:

答案 0 :(得分:2)

如果在上面的函数中,您的代码没有进入循环或if (linejd.Contains(textfind))块,该怎么办?该函数不返回任何值!

我倾向于建议声明一个函数的结果变量并在函数中设置它的值,然后在结尾处返回它:

static public string nextstring(string textfind)
{
    string result = string.Empty;

    List<string> found = new List<string>();
    string linejd;

    /* ********************************************************
    * Find the line with certain string */

    using (StreamReader efile = new StreamReader(FILENAME))
     // using (efile)
    {
        int counter = 0;
        while ((linejd = efile.ReadLine()) != null
                && string.IsNullOrWhiteSpace(result))    // Quit the loop once we have a result!
        {
            counter++;
            if (linejd.Contains(textfind))
            {
                found.Add(linejd);
                string nextstring = efile.ReadLine();
                result = nextstring;               }
        }
    }
    return result;
}

答案 1 :(得分:1)

如果条件linejd.Contains(textfind)永远不为真,那么函数将永远不会返回任何内容,但函数声明表明它将返回一个字符串。您可以通过在using块之后返回默认值(例如空字符串)来解决此问题。

答案 2 :(得分:1)

有两个原因导致函数在没有返回值的情况下退出:

  1. 该文件为空,因此永远不会输入while循环。
  2. 条件linejd.Contains(textfind)永远不会是true
  3. 即使您知道文件永远不会为空,并且文件中始终可以找到该字符串,编译器也不知道。 (虽然如果您知道始终可以找到该字符串,while循环没有意义,因为这意味着您永远不会到达文件的末尾。)

    您需要告诉编译器如何处理这两种情况,例如在函数末尾添加return null;

    或者重写代码,使其实际依赖于始终包含某些内容的文件,并始终找到该字符串。这样就没有松散的目的可以照顾。这当然意味着如果文件实际上是空的或者找不到字符串,代码将崩溃或挂起。

答案 3 :(得分:1)

如何使用Linq?

public static string NextString(string textfind)
{
    return File.ReadLines(FILENAME)
           .SkipWhile(line => !line.Contains(textfind))
           .Skip(1)
           .First();
}

答案 4 :(得分:0)

当if case总是出错时,那么你的方法将什么也不返回..这就是你得到错误的原因。 尝试在方法结束之前写一个返回值,如:

public static string NextString(string textfind)
 {
 List<string> found = new List<string>();
 string linejd;
 string new_string = string.Empty;

using (StreamReader efile = new StreamReader(FILENAME))
{
    int counter = 0;
    while ((linejd = efile.ReadLine()) != null)
    {
        counter++;
        if (linejd.Contains(textfind))
        {
            found.Add(linejd);
            string nextstring = efile.ReadLine();
            return nextstring;
        }
    }
}


return (new_string); 

}